私は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
エラーの説明はこれです:
要求エンティティが要求されたmethod()の要求されたリソースでサポートされていない形式であるため、サーバーはこの要求を拒否しました。
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;
}
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
フラグはPOST要求を意味するため、-d
を使用する場合、-d
は optional になります。
Windowsでは、物事が少し異なります。コメントスレッドを見てください。
body.json
と言ってファイルにデータを入れてみてください。
curl -H "Content-Type: application/json" --data @body.json http://localhost:8080/ui/webapp/conf
あなたはrestyが役に立つと思うかもしれません: https://github.com/micha/resty
これはラッパーラウンドCURLで、コマンドラインREST要求を単純化します。あなたはそれをあなたの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
また、Content Typeヘッダーを追加する必要があることもよくあります。ただし、デフォルトを設定するには、サイトごとにメソッドごとに設定ファイルを追加します。 デフォルトのRESTYオプションの設定
それは私のために働いた:
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";
}
IdOnly
はidプロパティを持つ単純な _ pojo _ です。
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
例として、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
これは私にとってはうまくいった。
curl -X POST --data @json_out.txt http://localhost:8080/
どこで、
-X
http動詞を意味します。
--data
送信したいデータを意味します。
私はちょうど同じ問題に出くわします。次のように指定すれば解決できます
-H "Content-Type: application/json; charset=UTF-8"
CURL Windowsを使って、これを試してください。
curl -X POST -H "Content-Type:application/json" -d "{\"firstName\": \"blablabla\",\"lastName\": \"dummy\",\"id\": \"123456\"}" http-Host/_ah/api/employeeendpoint/v1/employee
直感的なGUIで Postman を使用してcURL
コマンドを組み立てることができます。
Code
をクリックcURL
を選択しますcURL
コマンドをコピーして貼り付けます注:ドロップダウンリストに自動リクエスト生成のためのいくつかのオプションがあります、それで私は私の投稿がそもそも必要だと思った理由です。
HTTPie はcurl
に代わる推奨方法です。
$ http POST http://example.com/some/endpoint name=value name1=value1
それはデフォルトでJSONを話し、有効なJSONとしてデータをエンコードするのと同様にあなたのために必要なヘッダを設定することを取り扱います。もあります:
Some-Header:value
ヘッダ用
name==value
クエリ文字列パラメータ用。大量のデータがある場合は、JSONエンコードされているファイルから読み取ることもできます。
[email protected]
次のように、標準入力から--file-upload
オプションを使用して、JSONコンテンツをファイルに入れてcurlに渡すこともできます。
echo 'my.awesome.json.function({"do" : "whatever"})' | curl -X POST "http://url" -T -
これは私にとってはうまくいきましたが、さらに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認証を使うべきではありません。
WindowsにCygwinのcURL 7.49.1を使用しました。そしてJSON引数で--data
または--data-binary
を使用すると、cURLは混乱し、JSON内の{}
をURLテンプレートとして解釈します。 cURL globbingを無効にするために-g
引数を追加することでそれが修正されました。
角かっこ付きのURLをcurlに渡すも参照してください。
これは私のために働いた:
curl -H "Content-Type: application/json" -X POST -d @./my_json_body.txt http://192.168.1.1/json
私はWebサーバーでテストするために以下のフォーマットを使用しています。
use -F 'json data'
このJSON辞書形式を想定しましょう。
{
'comment': {
'who':'some_one',
'desc' : 'get it'
}
}
curl -XPOST your_address/api -F comment='{"who":"some_one", "desc":"get it"}'
This worked for me for windows10
curl -d "{"""owner""":"""sasdasdasdasd"""}" -H "Content-Type: application/json" -X PUT http://localhost:8080/api/changeowner/CAR4
ペイロードを追加するには-dオプションを使用します
curl -X POST \
http://<Host>:<port>/<path> \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"foo": "bar",
"lorem": "ipsum"
}'
加えて:
POSTメソッドを使用するには、-X POSTを使用します。
受け入れタイプのヘッダーを追加するには、-H 'Accept:application/json'を使用します。
コンテンツタイプヘッダを追加するには、-H 'Content-Type:application/json'を使用します。
動的データを含める場合、別の方法があります。
#!/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"