curlを使用してRESTAPIをテストする
1. 概要
このチュートリアルでは、curl。を使用したRESTAPIのテストの概要を説明します。
curlは、データを転送するためのコマンドラインツールであり、HTTPを含む約22のプロトコルをサポートします。この組み合わせにより、RESTサービスをテストするための非常に優れたアドホックツールになります。
2. コマンドラインオプション
curlは、200を超えるコマンドラインオプションをサポートしています。 コマンドのURLに、それらを0個以上含めることができます。
目的に使用する前に、私たちの生活を楽にする2つを見てみましょう。
2.1. 冗長
テストするときは、詳細モードを次のように設定することをお勧めします。
curl -v http://www.example.com/
その結果、コマンドは、解決されたIPアドレス、接続しようとしているポート、ヘッダーなどの役立つ情報を提供します。
2.2. 出力
デフォルトでは、curlは応答本文を標準出力に出力します。 さらに、ファイルに保存するための出力オプションを提供できます。
curl -o out.json http://www.example.com/index.html
これは、応答サイズが大きい場合に特に役立ちます。
3. curlを使用したHTTPメソッド
すべてのHTTPリクエストにはメソッドが含まれています。 最も一般的に使用されるメソッドは、GET、POST、PUT、およびDELETEです。
3.1. 得る
これは、curlを使用してHTTP呼び出しを行う場合のデフォルトの方法です。 実際、前に示した例は単純なGET呼び出しでした。
ポート8082でサービスのローカルインスタンスを実行しているときに、次のコマンドのようなものを使用してGET呼び出しを行います。
curl -v http://localhost:8082/spring-rest/foos/9
詳細モードがオンになっているため、応答本文とともにもう少し情報を取得します。
* Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8082 (#0)
> GET /spring-rest/foos/9 HTTP/1.1
> Host: localhost:8082
> User-Agent: curl/7.60.0
> Accept: */*
>
< HTTP/1.1 200
< X-Application-Context: application:8082
< Content-Type: application/json;charset=UTF-8
< Transfer-Encoding: chunked
< Date: Sun, 15 Jul 2018 11:55:26 GMT
<
{
"id" : 9,
"name" : "TuwJ"
}* Connection #0 to host localhost left intact
3.2. 役職
このメソッドを使用してデータを受信サービスに送信します。つまり、データオプションを使用します。
これを行う最も簡単な方法は、コマンドにデータを埋め込むことです。
curl -d 'id=9&name=baeldung' http://localhost:8082/spring-rest/foos/new
または、次のように、リクエスト本文を含むファイルをデータオプションに渡すこともできます。
curl -d @request.json -H "Content-Type: application/json"
http://localhost:8082/spring-rest/foos/new
上記のコマンドをそのまま使用すると、次のようなエラーメッセージが表示される場合があります。
{
"timestamp" : "15-07-2018 05:57",
"status" : 415,
"error" : "Unsupported Media Type",
"exception" : "org.springframework.web.HttpMediaTypeNotSupportedException",
"message" : "Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported",
"path" : "/spring-rest/foos/new"
}
これは、curlがすべてのPOST要求に次のデフォルトヘッダーを追加するためです。
Content-Type: application/x-www-form-urlencoded
これは、ブラウザがプレーンPOSTで使用するものでもあります。 私たちの使用法では、通常、必要に応じてヘッダーをカスタマイズしたいと思います。
たとえば、サービスがJSONコンテンツタイプを予期している場合、-Hオプションを使用して元のPOSTリクエストを変更できます。
curl -d '{"id":9,"name":"baeldung"}' -H 'Content-Type: application/json'
http://localhost:8082/spring-rest/foos/new
Windowsコマンドプロンプトは、Unixライクなシェルのような一重引用符をサポートしていません。
その結果、必要に応じて一重引用符をエスケープしようとしますが、一重引用符を二重引用符に置き換える必要があります。
curl -d "{\"id\":9,\"name\":\"baeldung\"}" -H "Content-Type: application/json"
http://localhost:8082/spring-rest/foos/new
また、多少大量のデータを送信したい場合は、通常、データファイルを使用することをお勧めします。
3.3. 置く
この方法はPOSTと非常に似ていますが、既存のリソースの新しいバージョンを送信する場合に使用します。 これを行うには、-Xオプションを使用します。
リクエストメソッドタイプについての言及がない場合、curlはデフォルトでGETを使用します。 したがって、PUTの場合のメソッドタイプについて明示的に言及します。
curl -d @request.json -H 'Content-Type: application/json'
-X PUT http://localhost:8082/spring-rest/foos/9
3.4. 消去
ここでも、-Xオプションを使用してDELETEを使用することを指定します。
curl -X DELETE http://localhost:8082/spring-rest/foos/9
4. カスタムヘッダー
デフォルトのヘッダーを置き換えるか、独自のヘッダーを追加できます。
たとえば、Hostヘッダーを変更するには、次のようにします。
curl -H "Host: com.baeldung" http://example.com/
User-Agentヘッダーをオフにするには、空の値を入力します。
curl -H "User-Agent:" http://example.com/
テスト中の最も一般的なシナリオは、Content-TypeヘッダーとAcceptヘッダーを変更することです。 各ヘッダーの前に-Hオプションを付ける必要があります。
curl -d @request.json -H "Content-Type: application/json"
-H "Accept: application/json" http://localhost:8082/spring-rest/foos/new
5. 認証
認証を必要とするサービスは、401 –未承認のHTTP応答コードと関連するWWW-Authenticateヘッダーを送り返します。
基本認証の場合、ユーザーオプションを使用して、ユーザー名とパスワードの組み合わせをリクエスト内に埋め込むことができます。
curl --user baeldung:secretPassword http://example.com/
ただし、認証に OAuth2を使用する場合は、最初に認証サービスからaccess_tokenを取得する必要があります。
サービス応答には、 access_token:が含まれます。
{
"access_token": "b1094abc0-54a4-3eab-7213-877142c33fh3",
"token_type": "bearer",
"refresh_token": "253begef-868c-5d48-92e8-448c2ec4bd91",
"expires_in": 31234
}
これで、Authorizationヘッダーでトークンを使用できます。
curl -H "Authorization: Bearer b1094abc0-54a4-3eab-7213-877142c33fh3" http://example.com/
6. 結論
この記事では、curlの最低限の機能を使用してRESTサービスをテストする方法を示しました。 ここで説明した以上のことができますが、私たちの目的では、これで十分です。
コマンドラインでcurl -hと入力して、使用可能なすべてのオプションを確認してください。 デモンストレーションに使用されるRESTサービスは、ここGitHubで利用できます。