4.1 send() メソッド、BodyHandlers
http リクエストの作成方法の学習は終了したので、最も重要なこのリクエストの送信に進むことができます。最も単純なケースでは、これは簡単に実行できます。
HttpRequest request = HttpRequest.newBuilder(new URI("https://codegym.cc")).build();
HttpClient client = HttpClient.newBuilder()
.version(Version.HTTP_1_1)
.build();
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
System.out.println(response.statusCode() );
System.out.println(response.body() );
そして、これらは何ですかBodyHandlers
?どう思いますか?リクエストを送信したということは、回答を受け取る必要があることを意味しますhttp response
。この応答には、response body
文字列、ファイル、バイト配列、InputStream を含めることができます。
はい、はい、そうです。リクエストを作成するときと同様に、response body
レスポンスのタイプを指定する必要があります。合計 8 個の部分を含めることができます。
BodyHandlers.ofByteArray
BodyHandlers.ofString
BodyHandlers.ofFile
BodyHandlers.discarding
BodyHandlers.replacing
BodyHandlers.ofLines
BodyHandlers.fromLineSubscriber
BodyHandlers
メソッドに渡した型に応じてsend()
、そのような結果の型が返されます。例:
// response body is ignored
HttpResponse<Void> response = client.send(request, BodyHandlers.discarding());
// response body is a string
HttpResponse<String>response = client.send(request, BodyHandlers.ofString());
// response body is a file
HttpResponse<Path> response = client.send(request, BodyHandlers.ofFile(Paths.get("readme.txt")));
// response body is an InputStream
HttpResponse<InputStream> response = client.send(request, BodyHandlers.ofInputStream());
ファイルを応答として送信する必要がある場合は、BodyHandlers.ofFile()
ローカル ファイルの名前をメソッドに渡す必要があります。ローカル ファイルは HttpClient オブジェクトによって保存されます。
4.2 followRedirects() メソッド
また、リクエストを送信するときに、サーバーが応答で301
または302
(一時的または永続的なリダイレクト)を送信した場合に HttpClient が行うべき動作を指定できます。サーバーがコードを送信したとします302
。この状況を追跡し、応答から新しい URL を取得し、新しいアドレスにリクエストを送信する必要があります。
特にこの状況は一般的であり、すべての http クライアントで長い間自動化されてきたことを考えると、私はこれを行いたくありません。また、この HttpClient では、リクエストを送信するときに選択するリダイレクト モードを指定するだけです。
HttpResponse response = HttpClient.newBuilder()
.followRedirects( HttpClient.Redirect.ALWAYS )
.build()
.send(request, BodyHandlers.ofString());
リダイレクトのオプションは 3 つだけです。
- いつも- いつも;
- 決して- 決して;
- NORMAL - 常に、HTTPS -> HTTP を除く。
ご覧のとおり、ここには多くのオプションはありませんが、カスタマイズ機能がないよりもあったほうが常に良いです。
4.4 proxy() メソッド
他にも便利なオプションがいくつかありますが、あまり使用されません。必要になるまでは、正確には必要ありません:)
1つ目はプロキシです。通常の生活ではこれらに遭遇することはほとんどありませんが、多くの大企業では内部に複雑なインターネット トラフィック セキュリティ システムがあり、そのためさまざまなプロキシ設定が行われています。
もちろん、そのような企業の内部で動作するソフトウェアは、いつかプロキシを使用する必要があるという事実に遭遇するでしょう。したがって、このようなオプションもここにあるのは良いことです。
プロキシの設定は非常に簡単です - 例:
HttpResponse<String> response = HttpClient.newBuilder()
.proxy( ProxySelector.getDefault())
.build()
.send(request, BodyHandlers.ofString());
ここではデフォルトのプロキシが選択されていますが、独自のプロキシを設定することもできます。
HttpResponse response = HttpClient.newBuilder()
.proxy(ProxySelector.of(new InetSocketAddress("proxy.microsoft.com", 80)))
.build()
.send(request, BodyHandlers.ofString());
プロキシを正確にどのように使用するかについては、このコースの範囲に含まれていないため、考慮しません。
4.5 オーセンティケーター()
そして、もう一つ重要な点があります。HTTP プロトコルは認証をサポートしています。まさにプロトコルレベルです。
今ではこの方法はほとんど使われなくなりましたが、20年ほど前は一般的でした。HTTP リクエストは次のようになります。
http://username@example.com/
あるいは次のようにもできます。
http://username:password@example.com/
これは郵便ではありません。まさにこれがリンクです。そして、はい、あなたはそうは思いませんでした。ログインとパスワードさえも http リクエストで直接指定できます。はい、今でもできます。だからこそ、今は普通こんなことをする人はいないと書いているのです。しかし、そのような可能性もあります。
Authenticator auth = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
"username",
"password".toCharArray());
}
};
HttpResponse<String> response = HttpClient.newBuilder()
.authenticator(auth).build()
.send(request, BodyHandlers.ofString());
これは面白い!“password"
コード内ではなく、なぜそう書かれているか知っていますか"password".toCharArray()
?
コンストラクターの 2 番目のパラメーターPasswordAuthentication
が ではないためString
ですCharArray
。
では、なぜ 2 番目のパラメータがそうではないのでしょString
うかCharArray
?
セキュリティ上の理由から、独自のアプリケーションであっても、すべてのパスワードを文字列全体として保存することは許可されていないためです。つまり、アプリケーションのメモリ内にパスワードを文字列として保存すべきではありません。誰かが湿ったメモリを作成したとしても、そこからパスワードを引き出すことができないように...
しかし同時に、パスワードは安全でない HTTP プロトコルを介して世界の半分に送信される可能性があります :) :) :)
良い。世界は完璧ではありません。
このトピックの詳細については、以下のリンクを参照してください。
GO TO FULL VERSION