2016-11-07 6 views
0

リクエストは、URLからコンテンツを取得し、コンテンツを(毎回異なる)処理してから、同じURLに返信します。 GETメソッドを実行した後にsetRequestMethod( "POST")しようとすると、「メソッドをリセットできません:接続済みです」というメッセージが表示されます。私のコードは以下の通りですJava - GETとPOSTの両方で1つのHttpURLConnectionを開く方法

public class MyClass { 

    /** 
    * @param args 
    */ 

    public MyClass() {}; 

    public void process() { 
     String url = "http://www.somesite.com/"; 
     String strPage = null; 
     int n = 0; 

     try{ 
      URL urlObj = new URL(url); 
      HttpURLConnection urlConnection = 
        (HttpURLConnection)urlObj.openConnection(); 
      InputStream in = urlConnection.getInputStream(); 

      BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 

      String strWhole = null; 
      while(null != (strPage = reader.readLine())){ 
       strWhole += strPage; 
      } 

      //handle content here and calculate result 
      ... ... 
      //send result below 

      urlConnection.setRequestMethod("POST"); 
      urlConnection.setDoOutput(true); 
      String urlParameters = "aa=bb&cc=dd&ee=ff"; 

      DataOutputStream wr = new DataOutputStream(urlConnection.getOutputStream()); 
      wr.writeBytes(urlParameters); 
      wr.flush(); 
      wr.close();    

      InputStream in1 = urlConnection.getInputStream(); 

      BufferedReader reader1 = new BufferedReader(new InputStreamReader(in)); 


      while(null != (strPage = reader1.readLine())){ 
       System.out.println(strPage); 
      } 

      reader1.close();    
     } 
     catch(Exception e){ 
      String exception = e.getMessage(); 
      System.out.println(exception); 
      if (reader != null) { 
       reader.close(); 
      } 

      if (reader1 != null) { 
       reader1.close(); 
      } 
     } 

     return; 

    } 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     MyClass dp = new MyClass(); 
     dp.process(); 

    } 

} 

答えて

0

すべてのパラメータを最初に設定する必要があります。ここで私は自分のアプリケーションで使用するコードは次のとおりです。

 HttpURLConnection connection = (HttpURLConnection)new URL(url).openConnection(); 
    connection.setDoOutput(true); 
    connection.setDoInput(true); 
    connection.setInstanceFollowRedirects(false); 
    connection.setRequestMethod("POST"); 
    connection.setRequestProperty("app_token", "my token"); // optional header you can set with your own data 
    connection.setRequestProperty("charset", "utf-8"); 
    connection.setRequestProperty("Content-Length", String.valueOf(urlParameters.getBytes().length)); 
    connection.setUseCaches (false); 
    DataOutputStream wr = new DataOutputStream(connection.getOutputStream()); 
    wr.writeBytes(urlParameters); 
    wr.flush(); 
    wr.close(); 
    connection.disconnect(); 
    InputStream is = connection.getInputStream(); 
    byte[] b = readWithoutSize(is); 
    is.close(); 

readWithoutSizeは次のとおりです。

public static byte[] readWithoutSize(InputStream is) throws IOException 
    { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(4096); 
     byte[] buf = new byte[512]; 
     int leu; 
     while ((leu = is.read(buf)) != -1) 
     baos.write(buf,0,leu); 
     return baos.toByteArray(); 
    } 
+0

@Guiherme openConnection()を呼び出す必要があるときは? –

+0

すみません、コードを修正しました。 –

+0

@Guihermeありがとう、それは私のためには動作しません。 kgeorgiyの解決策は私が必要としているものです。 –

1

HttpURLConnectionインスタンスを再利用することは不可能です。しかしdocumentationは、Javaがあなたのために接続を再利用すると言っています。

JDKは、HTTP/1.1とHTTP/1.0の両方の永続接続をサポートしています。

アプリケーションはレスポンスボディを読み終わるか、アプリケーションがURLConnection.getInputStream()によって返さInputStreamclose()を呼び出したときに、JDKのHTTPプロトコルハンドラは、接続をクリーンアップしようとすると、成功した場合は、再利用のための接続キャッシュに接続を置きます将来のHTTPリクエストによって。

HTTPキープアライブのサポートは透過的に行われます。

したがって、手動で接続を再利用する必要はありません。

+0

close()を呼び出しても機能せず、同じ問題を抱えてPOSTをやり直します。 –

+0

'close()'の後では動作しません。単に新しい接続 'openConnection'をオープンするだけです。 – kgeorgiy

+0

あなたの方法は私が必要なものです、ありがとう:) –

関連する問題