2008-09-02 16 views
10

私は、それが必ずしもHTTPポストが起ころうとしていることを意味するものではないHTTP java.net.URLを作成し、それにopenConnection()を呼び出す場合は?私はopenStream()がGETを意味することを知っています。もしそうなら、生のソケットレイヤーを扱わなくても、他のHTTP動詞のどれを実行すればよいですか?新しいURL(...)openConnection()は必然的にPOSTを意味しますか?

答えて

16

あなたがopenConnection()を使用してURLConnectionオブジェクトを取得した場合には、実際にサーバとの通信を開始しません。それは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()を使用してもおそらく存在するでしょう。

3

ありません、それはしていません。しかし、URLのプロトコルがHTTPの場合、戻りオブジェクトとしてHttpURLConnectionが返されます。このクラスには、使用するHTTPメソッドを指定するsetRequestMethodメソッドがあります。

あなたはより洗練されたものをしたい場合は、おそらくJakarta HttpClientのようなライブラリを使用した方がいいでしょう。

関連する問題