HTTP を作成してjava.net.URL
呼び出しopenConnection()
た場合、必ず HTTP ポストが発生することを意味しますか? 私はそれopenStream()
がGETを意味することを知っています。もしそうなら、生のソケット層を操作することなく、他の HTTP 動詞の 1 つをどのように実行しますか?
2 に答える
URLConnection
それを使用してオブジェクトを取得しopenConnection()
ても、実際にはサーバーとの通信は開始されません。からストリームを取得するまで、それは起こりませんURLConnection()
。最初に接続を取得すると、実際に開く前にヘッダーやその他の接続プロパティを追加/変更できます。
URLConnection のライフサイクルは少し奇妙です。ストリームの 1 つを取得するまで、ヘッダーはサーバーに送信されません。入力ストリームを取得するだけなら、GET を実行し、ヘッダーを送信してから、出力を読み取れると思います。出力ストリームを取得した場合、データを書き込むと想定しているため、POSTとして送信すると思います(setDoOutput(true)
出力ストリームを機能させるために呼び出す必要がある場合があります)。入力ストリームを取得するとすぐに、出力ストリームが閉じられ、サーバーからの応答を待ちます。
たとえば、これは POST を実行する必要があります。
URL myURL = new URL("http://example.com/my/path");
URLConnection conn = myURL.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
OutputStream os = conn.getOutputStream();
os.write("Hi there!");
os.close();
InputStream is = conn.getInputStream();
// read stuff here
これはGETを行いますが:
URL myURL = new URL("http://example.com/my/path");
URLConnection conn = myURL.openConnection();
conn.setDoOutput(false);
conn.setDoInput(true);
InputStream is = conn.getInputStream();
// read stuff here
URLConnection
また、他の奇妙なことをします。サーバーがコンテンツの長さを指定すると、明示的に閉じてもURLConnection
、その量のデータを受信するまで、基になる入力ストリームを開いたままにします。これにより、ネットワーク接続が開いたままになるため、クライアントをきれいにシャットダウンするのが少し難しくなるため、多くの問題が発生しました。これは、使用するだけでもおそらく存在します。URLConnection
getStream()
いいえ、違います。ただし、URL のプロトコルが HTTP の場合はHttpURLConnection
、戻りオブジェクトとして を取得します。このクラスには、setRequestMethod
使用する HTTP メソッドを指定するメソッドがあります。
より洗練された処理を行いたい場合は、Jakarta HttpClientなどのライブラリを使用することをお勧めします。