web-dev-qa-db-ja.com

どうやって POST 端末/コマンドラインからTest Spring RESTへのCurlを使用したJSONデータ

私は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;
}
2427
kamaci

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では、物事が少し異なります。コメントスレッドを見てください。

3800

body.jsonと言ってファイルにデータを入れてみてください。

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

あなたは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オプションの設定

91
mo-seph

それは私のために働いた:

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 _ です。

77
Luis

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
74
venkatnz

例として、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
47

これは私にとってはうまくいった。

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

どこで、

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

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

34
felipealves.gnu

私はちょうど同じ問題に出くわします。次のように指定すれば解決できます

-H "Content-Type: application/json; charset=UTF-8"
31
Steffen Roller

CURL Windowsを使って、これを試してください。

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

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

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

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

22
kiltek

RESTfulインターフェースに対してたくさんのJSON送信/応答をテストしているのであれば、Chrome用の Postman プラグイン(Webサービスのテストを手動で定義できる)とそのNode.jsをチェックするとよいでしょう。 -based Newman コマンドラインコンパニオン(Postmanテストの「コレクション」に対するテストを自動化することができます)両方とも無料でオープンです。

17
ftexperts

HTTPiecurlに代わる推奨方法です。

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

それはデフォルトでJSONを話し、有効なJSONとしてデータをエンコードするのと同様にあなたのために必要なヘッダを設定することを取り扱います。もあります:

Some-Header:value

ヘッダ用

name==value

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

 [email protected]
15
tosh

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

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

これは私にとってはうまくいきましたが、さらに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に渡すも参照してください。

14
davenpcj

これは私のために働いた:

curl -H "Content-Type: application/json" -X POST -d @./my_json_body.txt http://192.168.1.1/json
13
Amit Vujic

私は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"}'
7
user3180641

あなたはCURLに変換するためにpostmanを使用することができます enter image description here 

enter image description here 

2
forever LA
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'を使用します。

0
Sma Ma

動的データを含める場合、別の方法があります。

#!/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"
0
Anand Rockzz