2016-05-17 17 views
0

私は、POSTを使ってAPIに渡そうとしているオブジェクトの配列を持っています。それが必要として、第一の目的は、通過します、そして私が得る:URLConnection - 応答が読み込まれた後にリクエスト本体を書き込めません。

java.net.ProtocolException: cannot write request body after response has been read 

私はそれは私が物事をやっているだけのためだかなり確信しているが、私はまだAndroidの勉強としようとしています今は1時間とちょっと分かります。

私は皆さんに助けを求めるでしょう。私は後で使用されるIDフィールドのためにそれをpsrseできるように、POSTに対する各応答を受け取る必要があります。あなたは私のFORループの中でそれを解析して、私が後で参照するリストにIDを格納しているのを見るでしょう。以下のPOSTのための

コード:

try { 
      url = new URL("##Edited Out##"); 
      conn = (HttpsURLConnection) url.openConnection(); 

      // Create the SSL connection 
      sc = SSLContext.getInstance("TLS"); 
      sc.init(null, null, new SecureRandom()); 
      conn.setSSLSocketFactory(sc.getSocketFactory()); 

      // Use this if you need SSL authentication 
      String userpass = "##Edited Out##:##Edited Out##"; 
      String basicAuth = "Basic " + Base64.encodeToString(userpass.getBytes(), Base64.DEFAULT); 
      conn.setRequestProperty("Authorization", basicAuth); 
      conn.setRequestProperty("Content-Type", "application/json;odata=verbose"); 

      // set Timeout and method 
      conn.setReadTimeout(7000); 
      conn.setConnectTimeout(7000); 
      conn.setRequestMethod("POST"); 
      conn.setDoInput(true); 
      conn.setDoOutput(true); 

      conn.connect(); 

      JSONObject juo = new JSONObject(); 

      for (int i = 0; i<objects.size(); i++){ 

       juo.put("Field1", "Data for field 1 here"); 
       juo.put("Field2", "Data for field 2 here"); 
       juo.put("Field3", "Data for field 3 here"); 

       wr = new OutputStreamWriter(conn.getOutputStream()); 
       wr.write(juo.toString()); 
       wr.flush(); 
       wr.close(); 

       Log.d("ITEM STRING", juo.toString()); 

       BufferedReader br = new BufferedReader(new InputStreamReader(
         conn.getInputStream(), "utf-8")); 
       while ((line = br.readLine()) != null) { 
        sb.append(line + "\n"); 
       } 
       br.close(); 

       Log.d("HTTP BR", "" + sb.toString()); 

       jObject = XML.toJSONObject(sb.toString()); 

       Log.d("JSON OBJECT", jObject.toString()); 

       JSONObject menuObject = jObject.getJSONObject("entry"); 
       JSONObject contentObject = menuObject.getJSONObject("content"); 
       JSONObject propertiesObject = contentObject.getJSONObject("m:properties"); 
       JSONObject productObject = propertiesObject.getJSONObject("d:Product_Id"); 
       String retProId = productObject.getString("content"); 

       partIDs.add(retProId); 

       Log.d("PART ID", retProId); 
      } 

      int HttpResult = conn.getResponseCode(); 
      Log.d("HTTP RESULT", String.valueOf(HttpResult)); 
      Log.d("HTTP RESPONSE", conn.getResponseMessage()); 

     } catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
     } catch (KeyManagementException e) { 
      e.printStackTrace(); 
     } catch (ProtocolException e) { 
      e.printStackTrace(); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     return null; 

EDIT: 以下について重複コメント私が受けてるエラーが若干異なっています。私はそれの原則を理解していますが、私の.getRespondeCodeは私のforループの外にあり、それはサイクリングする必要があります。しかし、そうではありません。

私はそれが私が解析する必要がIDが含まれているとして計上オブジェクトごとにサーバの応答文字列を取得する必要がありobjects.size> = 2

場合、このエラーが発生します。

+1

可能な重複は、[入力を読んだ後に出力を書き込むことができません](http://stackoverflow.com/questions/11413028/cannot-write-output-after-reading-input) – e4c5

答えて

1

HTTPプロトコルは要求 - 応答パターンに基づいています。要求を先に送信し、サーバーが応答します。サーバーが応答したら、それ以上コンテンツを送信することはできませんが、意味がありません。

コードを見ると、forループで応答が得られます。 1つの応答がアクセスされると、次の時間ループは例外をスローする。複数のリクエストを作成する場合は、毎回新しいurlconnectionを作成する必要があります。例えば。

private void requestMethod(){ 
     //your for loop goes here 

    } 

    private void backgroundOperation(/**required parameter*/){ 
     // your httpurlconnection code goes here don't use for loop. use finally block to close connection also 
    } 
+0

このいただきありがとうございます。私はやや違ったやり方でやっていましたが、これは私を軌道に乗せました! – Noodelz

関連する問題