jsonパラメータを使用したCurl GETリクエスト


124

次のように、cURLを介してコマンドプロンプトからリモートREST APIに「GET」リクエストを送信しようとしています。

curl -X GET -H "Content-type: application/json" -H "Accept: application/json"  "http://server:5050/a/c/getName/{"param0":"pradeep"}"

ただし、出力は返されません。ブラウザから直接URLにpingを実行しようとしましたが、応答を正常に取得できます。コマンドの何が問題なのか理解できません。

基本的に、curlを介した応答としてjsonデータを提供するリモートRESTサービスに「GET」リクエストを設定したいと思います。誰かが私にどんな過ちを犯しているか教えてもらえますか?さまざまな投稿を試しましたが、すべてがGETではなくPOSTリクエストについて話します。


サーバー側でどのエラーが投稿されていますか?
Scary Wombat 2014年

エラーはありません。サーバー側で正常に実行されています。しかし、カール側からは何も表示されません。数秒後にpingを実行するだけで、データなしで空白が表示されます。
Pradeep Simha 2014年

curl -i -H "Accept:application / json" " server:5050 / a / c / getName {" param0 ":" pradeep "}"で試すことができます(xの代わりにオプション-i)。
Harshal Bulsara 2014年

回答:


139

これはうまくいくはずです:

  curl -i -H "Accept: application/json" 'server:5050/a/c/getName{"param0":"pradeep"}'

xの代わりにオプション-iを使用します。


4
おそらく別の見積もりですか?「server:5050 / a / c / getName {'param0': 'pradeep'}」
AB

それは本当にいずれかでなければなりません'server:5050/a/c/getName{"param0":"pradeep"}'"server:5050/a/c/getName{\"param0\":\"pradeep\"}"
ベンジャミンW.

16

本文内にデータを送信する場合は、POSTまたはのPUT代わりにを作成する必要がありGETます。

私にとっては、あなたが送信しようとしているように見えるURIパラメータを使用してクエリをに関連していない、GETあなたはまた、これらのパラメータのを置くことができるPOSTPUTというように。

クエリは、疑問符( "?")で区切られたオプションの部分であり、本質的に階層構造ではない追加の識別情報を含みます。クエリ文字列の構文は一般的に定義されていませんが、セミコロンまたはアンパサンドで区切られた=ペアのシーケンスとして編成されています。

例えば:

curl http://server:5050/a/c/getName?param0=foo&param1=bar

7
HTTP要求メッセージには、メッセージ本文を含めることができます。GETセマンティクスのため、これはGETには決して役立ちません-リクエスト本文の内容があったとしても、応答を変更すべきではありません。
JarekPrzygódzki16年

12

本文にJSONを含むGETリクエストを送信したい場合(たとえば、XHRリクエストの場合、サーバーがGETリクエストでの本文の処理をサポートしていることがわかっている場合)、次のことができます。

curl -X GET \
  -H "Content-type: application/json" \
  -H "Accept: application/json" \
  -d '{"param0":"pradeep"}' \
  "http://server:5050/a/c/getName"

最近のほとんどのWebサーバーは、このタイプの要求を受け入れます。


これは機能せず、意図した結果が生成されます。デバッグにhttpbin.org/getを使用すると、次の結果になります。{ "args": {}, "headers": { "Accept": "application/json", "Content-Length": "20", "Content-Type": "application/json", "Host": "httpbin.org", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:57.0) Gecko/20100101 Firefox/57.0" }, "origin": "27.94.235.50, 27.94.235.50", "url": "https://httpbin.org/get" }何も受信されません。次のようなクエリ文字列を使用する必要がありますcurl -X GET https://httpbin.org/get?data=%7B%22param0%22%3A%22pradeep%22%7D
Jacques

それは、WebサーバーがGETリクエストの本文をチェックしているかどうかによって異なりますが、これは完全に標準的な動作ではありません。あなたが言うようにURLクエリパラメータを使用する方が良いかもしれません。getリクエストで本文を使用する場合の問題の1つは、ブラウザーがブラウザーの履歴をナビゲートしてリクエストを再生できないことですが、これはXHRリクエストではおそらく問題ありません。
Steven Soroka

別の方法として、サーバー側で十分な制御ができる場合、jsonデータに「メソッド」のような特別なプロパティを追加します:「取得」、ポストリクエストでペイロードを送信し、サーバーのコードでこれを解釈しますgetリクエストとして。
ジャック

@Jacquesは確かですが、サーバーを制御できる場合は、GETリクエストの本文をサーバーに読み取らせるのと同じくらい簡単にできます。元の質問に戻ると、この接線全体は少しずれたトピックだと思います。質問をもう一度読んで、OPがサーバーを変更するためのアクセス権を持っているとは思いません。
Steven Soroka

はい、そうです。あなたがサーバーを制御する場合。私のコメントは、私が言ったように、意図した結果を生み出さない次のステートメントによって拍動されました:「ほとんどの最新のWebサーバーはこのタイプの要求を受け入れます」。実際には、彼らはあなたが説明した要求を受け入れますが、要求は意図した結果を生み出すことができません。または、次のようなステートメントを修正することもできます。「ほとんどの最近のWebサーバーは、サーバー側で直接制御できると想定してこのタイプのリクエストを受け入れますが、これは標準ではありません」
Jacques

8

GETは名前と値のペアを取ります。

次のようなものを試してください:

curl http://server:5050/a/c/getName/?param1=pradeep

または

curl http://server:5050/a/c/getName?param1=pradeep

通常のRESTは次のようになります。

curl http://server:5050/a/c/getName/pradeep GET URLでJSONを使用する場合、それは標準的な方法ではありません。


4

ユーザー名とパスワードで保護されたサービスについては、以下を使用します

curl -u admin:password -X GET http://172.16.2.125:9200 -d '{"sort":[{"lastUpdateTime":{"order":"desc"}}]}'

curl -X POST -H "Content-type:application / json" -d '{"stuff": "things"}' http:// ...
keithpjolley 2017

私が間違っている場合は修正してください。ただし、curlリクエストに-dを指定すると(メソッドを指定しないと)、リクエストがPOSTになります。
Gokigooooks

3

試す

curl -G ...

の代わりに

curl -X GET ...

通常、このオプションは必要ありません。あらゆる種類のGET、HEAD、POST、およびPUT要求は、専用のコマンドラインオプションを使用して呼び出されます。

このオプションは、HTTPリクエストで使用される実際の単語を変更するだけで、curlの動作を変更しません。したがって、たとえば適切なHEADリクエストを作成する場合、-X HEADを使用するだけでは不十分です。-I、--headオプションを使用する必要があります。


1

上記の解決策のいずれも、何らかの理由で私にとってうまくいきませんでした。これが私の解決策です。それはかなり基本的です。

curl -X GET API_ENDPOINT -H 'Content-Type:application / json' -d ' JSON_DATA '

API_ENDPOINTはAPIエンドポイントです。例:http : //127.0.0.1 : 80/ api

-Hは、ヘッダーコンテンツの追加に使用されています。

JSON_DATAはリクエスト本文で、:: {"data_key": "value"}のようになります。「」JSON_DATAを囲むは重要です。

-dの後は、GETリクエストで送信する必要があるデータです

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