JSONデータをcURLでPOSTするにはどうすればよいですか?


2833

Ubuntuを使用してcURLをインストールしました。Spring RESTアプリケーションをcURLでテストしたい。私はPOSTコードをJava側で記述しました。ただし、cURLでテストしたいと思います。JSONデータを投稿しようとしています。データの例は次のとおりです。

{"value":"30","type":"Tip 3","targetModule":"Target 3","configurationGroup":null,"name":"Configuration Deneme 3","description":null,"identity":"Configuration Deneme 3","version":0,"systemId":3,"active":true}

私はこのコマンドを使用します:

curl -i \
    -H "Accept: application/json" \
    -H "X-HTTP-Method-Override: PUT" \
    -X POST -d "value":"30","type":"Tip 3","targetModule":"Target 3","configurationGroup":null,"name":"Configuration Deneme 3","description":null,"identity":"Configuration Deneme 3","version":0,"systemId":3,"active":true \
    http://localhost:8080/xx/xxx/xxxx

それはこのエラーを返します:

HTTP/1.1 415 Unsupported Media Type
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Length: 1051
Date: Wed, 24 Aug 2011 08:50:17 GMT

エラーの説明はこれです:

要求エンティティが要求されたメソッド()の要求されたリソースでサポートされていない形式であるため、サーバーはこの要求を拒否しました。

Tomcatログ:「POST / ui / webapp / conf / clear HTTP / 1.1」415 1051

cURLコマンドの正しい形式は何ですか?

これは私のJavaサイドPUTコードです(GETとDELETEをテストしましたが、動作します):

@RequestMapping(method = RequestMethod.PUT)
public Configuration updateConfiguration(HttpServletResponse response, @RequestBody Configuration configuration) { //consider @Valid tag
    configuration.setName("PUT worked");
    //todo If error occurs response.sendError(HttpServletResponse.SC_NOT_FOUND);
    return configuration;
}

6
Spring 3.2.0の投稿リクエストのリンクを確認してください
AmirHd 2013年

8
複数の例でこれをカバーするRESTfulマイクロサービスのアドホックテストにCurlを使用する素晴らしい記事があります。
upitau

回答:


4342

content-typeをapplication / jsonに設定する必要があります。ただし-d、Content-Typeを送信しますがapplication/x-www-form-urlencoded、これはSpring側では受け入れられません。

curlのmanページを見ると、私はあなたが使うことができると思います-H

-H "Content-Type: application/json"

完全な例:

curl --header "Content-Type: application/json" \
  --request POST \
  --data '{"username":"xyz","password":"xyz"}' \
  http://localhost:3000/api/login

-Hのために短い--header-dのために--data

-request POSTあるオプションのあなたが使用している場合-dと、-dフラグはPOSTリクエストを意味します。


Windowsでは、状況が少し異なります。コメントスレッドを参照してください。


262
Windowsの場合、jsonを囲む一重引用符が機能せず、二重引用符をエスケープしてしまいました。 curl -X POST -H "Content-Type: application/json" -d "{ \"key1\": \"value1\" }" http://localhost:3000/api/method
hIpPy 2013

37
Windowsでは、この形式の引用符を使用して引用符をエスケープする必要がありました"{ """key1""": """value1""" }"。また、この回答:stackoverflow.com/questions/18314796/...
chodorowicz

4
@chodorowiczひどい!私はその構文をVBから知っているだけです!
ショーンパトリックフロイド

3
POSTリクエストで問題が発生しましたが、大文字の「Application / json」で解決したので、415エラーが発生した場合は、大文字を確認してください。
WiteCastle 2014

5
@ostrokachごめんなさい、あなたの時間を無駄にしました。構文は、OSXで投稿したときにうまくいきました(再試行していません)。それはプラットフォームの違いにすぎない、または違いました。私は賛成票がそれを助けた人々からのものであると思います。
Adam Tuttle、2015年

565

あなたのデータをファイルに入れて、言っbody.jsonてから使用してみてください

curl -H "Content-Type: application/json" --data @body.json http://localhost:8080/ui/webapp/conf

12
おそらくの--data-binary代わりにオプションを使用する必要があります--data。クライアントはデータをそのまま送信することを期待しますが--data、入力からCRとLFを取り除きます。
h2stein 2014年

14
インラインjson文字列でcUrlを使用するのは悪夢のようです。二重引用符文字をエスケープする必要があります。このようなファイルを使用する方が適しています。
Xtreme Biker 2014年

46
@ファイルの名前の前に文字を追加することが重要です。そうしないと機能しません。私はこのがらくたで頭を叩いて20分過ごしました...
Radu Murzea

3
このように、ファイルでJSONリントを実行して、JSONの解析にエラーがないかどうかを確認することもできます。
datashaman 2016

4
Windowsでは、ファイル名 "@ body.json"を二重引用符で囲む必要があります
Stomf '26

100

あなたはrestyが便利だと思うかもしれません:https//github.com/micha/resty

これは、コマンドラインRESTリクエストを簡素化するラッパーラウンドCURLです。これをAPIエンドポイントにポイントすると、PUTコマンドとPOSTコマンドが提供されます。(ホームページより抜粋した例)

$ resty http://127.0.0.1:8080/data #Sets up resty to point at your endpoing
$ GET /blogs.json                  #Gets http://127.0.0.1:8080/data/blogs.json
                                   #Put JSON
$ PUT /blogs/2.json '{"id" : 2, "title" : "updated post", "body" : "This is the new."}'
                                   # POST JSON from a file
$ POST /blogs/5.json < /tmp/blog.json

また、コンテンツタイプヘッダーを追加する必要がある場合もあります。ただし、デフォルトを設定するために、メソッドごと、サイトごとに構成ファイルを追加することで、これを一度行うことができます。デフォルトのRESTYオプションの設定


93

Windowsの場合、-d値を一重引用符で囲んでもうまくいきませんでしたが、二重引用符に変更するとうまくいきました。また、中括弧で二重引用符をエスケープする必要がありました。

つまり、以下は機能しませんでした。

curl -i -X POST -H "Content-Type: application/json" -d '{"key":"val"}' http://localhost:8080/appname/path

しかし、以下はうまくいきました:

curl -i -X POST -H "Content-Type: application/json" -d "{\"key\":\"val\"}" http://localhost:8080/appname/path

5
FYI-json本体を囲む二重引用符が抜けているようです
acanby 2016年

3
Windowsの、「周りのデータが作業をしない、何も引用符の代わりに働かないで私のために
rodedo

3
PowerShellを使用している場合は、この回答を参照してください。
rsenna 2018

86

それは私を使ってうまくいきました:

curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"id":100}' http://localhost/api/postJsonReader.do

これは、Springコントローラにうまくマッピングされました。

@RequestMapping(value = "/postJsonReader", method = RequestMethod.POST)
public @ResponseBody String processPostJsonData(@RequestBody IdOnly idOnly) throws Exception {
        logger.debug("JsonReaderController hit! Reading JSON data!"+idOnly.getId());
        return "JSON Received";
}

IdOnlyidプロパティを持つ単純なPOJOです。


56

例として、JSONファイルparams.jsonを作成し、次のコンテンツを追加します。

[
    {
        "environment": "Devel",
        "description": "Machine for test, please do not delete!"
    }
]

次に、次のコマンドを実行します。

curl -v -H "Content-Type: application/json" -X POST --data @params.json -u your_username:your_password http://localhost:8000/env/add_server


37

これは私にはうまくいきました。

curl -X POST --data @json_out.txt http://localhost:8080/

どこ、

-X http動詞を意味します。

--data 送信するデータを意味します。


5
-X POSTこの例では冗長である
ソフトウェアエンジニア

31

Postmanとその直感的なGUIを使用して、cURLコマンドを組み立てることができます。

  1. Postmanをインストールして起動する
  2. URL、投稿本文、リクエストヘッダーなどを入力します。
  3. クリック Code
  4. cURLドロップダウンリストから選択
  5. cURLコマンドをコピーして貼り付ける

注:ドロップダウンリストには自動リクエスト生成のオプションがいくつかあります。そのため、そもそも投稿が必要だと思いました。


6
Postmanにこの機能が含まれていることに気づかなかった。指摘してくれてありがとう!
ariestav

29

CURL Windowsを使用して、これを試してください:

curl -X POST -H "Content-Type:application/json" -d "{\"firstName\": \"blablabla\",\"lastName\": \"dummy\",\"id\": \"123456\"}" http-host/_ah/api/employeeendpoint/v1/employee

28

postmanを使用してCURLに変換できますここに画像の説明を入力してください

ここに画像の説明を入力してください


1
@ forever-LAに感謝します。それは私にとってライフセーバーのヒントでした
vibs2006

24

HTTPieはの代わりに推奨される代替手段curlです。

$ http POST http://example.com/some/endpoint name=value name1=value1

デフォルトでJSONを読み、必要なヘッダーの設定と有効なJSONとしてのデータのエンコードの両方を処理します。もあります:

Some-Header:value

ヘッダー、および

name==value

クエリ文字列パラメータ用。データの大きなチャンクがある場合は、JSONエンコードされているファイルから読み取ることもできます。

 field=@file.txt

20

RESTfulインターフェースに対して多数のJSON送信/応答をテストしている場合は、Chrome用のPostmanプラグイン(Webサービステストを手動で定義できるようにする)とそのNode.jsベースのNewmanコマンドを確認することをお勧めします。-lineコンパニオン(Postmanテストの「コレクション」に対するテストを自動化できるようにします。)無料とオープンの両方!


18

これは私にとってもうまくいき、さらにBASIC認証を使用しました:

curl -v --proxy '' --basic -u Administrator:password -X POST -H "Content-Type: application/json"
        --data-binary '{"value":"30","type":"Tip 3","targetModule":"Target 3","configurationGroup":null,"name":"Configuration Deneme 3","description":null,"identity":"Configuration Deneme 3","version":0,"systemId":3,"active":true}'
        http://httpbin.org/post

もちろん、SSLとチェック済み証明書なしでBASIC認証を使用することはできません。

今日、CygwinのcURL 7.49.1 for Windowsを使用してこれに再び遭遇しました...そして、JSON引数を使用する--data--data-binary、JSON引数を使用すると、cURLは混乱{}し、JSON内のをURLテンプレートとして解釈します。-gcURLグロビングをオフにする引数を追加することで修正されました。

括弧付きのURLをcurlに渡すも参照してください。


17

次のように、JSONコンテンツをファイルに入れ、--file-upload標準入力を介してオプションを使用してcurlに渡すこともできます。

 echo 'my.awesome.json.function({"do" : "whatever"})' | curl -X POST "http://url" -T -


10

以下のフォーマットを使用してWebサーバーでテストしています。

use -F 'json data'

次のJSON dict形式を想定します。

{
    'comment': {
        'who':'some_one',
        'desc' : 'get it'
    }
}

完全な例

curl -XPOST your_address/api -F comment='{"who":"some_one", "desc":"get it"}'

6

-dオプションを使用してペイロードを追加する

curl -X POST \
http://<host>:<port>/<path> \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"foo": "bar",
"lorem": "ipsum"
}'

加えて:

-X POSTを使用してPOSTメソッドを使用する

-H 'Accept:application / json'を使用して、Acceptタイプのヘッダーを追加します

-H 'Content-Type:application / json'を使用してコンテンツタイプヘッダーを追加します


使用しようとしましたが、{"errors":["no data provided"]}エラーが発生しました。
Suresh

6

このツールを確認してください。それはあなたが簡単にカールスニペットを作成するのに役立ちます。

curl -XGET -H "Accept: application/json" -d "{\"value\":\"30\",\"type\":\"Tip 3\",\"targetModule\":\"Target 3\",\"configurationGroup\":null,\"name\":\"Configuration Deneme 3\",\"description\":null,\"identity\":\"Configuration Deneme 3\",\"version\":0,\"systemId\":3,\"active\":true}" "http://localhost:8080/xx/xxx/xxxx"

6

これはWindows10で私のために働きました

curl -d "{"""owner""":"""sasdasdasdasd"""}" -H "Content-Type: application/json" -X  PUT http://localhost:8080/api/changeowner/CAR4

5

動的データを含める必要がある場合に、これを行う別の方法を次に示します。

#!/bin/bash

version=$1
text=$2
branch=$(git rev-parse --abbrev-ref HEAD)
repo_full_name=$(git config --get remote.origin.url | sed 's/.*:\/\/github.com\///;s/.git$//')
token=$(git config --global github.token)

generate_post_data()
{
  cat <<EOF
{
  "tag_name": "$version",
  "target_commitish": "$branch",
  "name": "$version",
  "body": "$text",
  "draft": false,
  "prerelease": false
}
EOF
}

echo "Create release $version for repo: $repo_full_name branch: $branch"
curl --data "$(generate_post_data)" "https://api.github.com/repos/$repo_full_name/releases?access_token=$token"

1
あなたは私の命を救いました!
Abhimanyu

4

この質問には多くの回答がありましたが、私が問題を抱えていた場所を共有したいと思います。

curl -X POST http:// your-server-end-point -H "Content-Type:application / json" -d @ path-of-your-json-file.json

参照してください、私はすべてを正しく行いました。JSONファイルのパスの前に逃した「@」は1つだけです。

インターネットで関連する実用的なドキュメントを1つ見つけました-https://gist.github.com/subfuzion/08c5d85437d5d4f00e58

それが少数を助けるかもしれないことを願っています。ありがとう


1

SWAGGERをスプリングブートアプリケーションに設定し、アプリケーションからAPIを呼び出すと、CURLリクエストも表示されます。

これはCURLを介してリクエストを生成する簡単な方法だと思います。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.