2016-05-17 13 views
0

Ich habe ein Array von Objekten, die ich versuchen, durch eine API zu senden. Das erste Objekt wird durchlaufen, wie es sollte, und ich bekomme dann:URLConnection - Kann Körper nicht schreiben, nachdem die Antwort gelesen wurde

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

ich ziemlich sicher bin, es ist nur die Reihenfolge, in der ich Dinge tue, aber ich bin immer noch lernen Android und haben versucht, eine Stunde und ein bisschen jetzt herauszufinden.

Ich dachte, ich würde an euch um Hilfe wenden! Ich muss jede Antwort auf den POST erhalten, damit ich es für ein ID-Feld pse, das später verwendet werden kann. Sie werden sehen, dass ich es in meiner FOR-Schleife analysiere und dann die IDs in einer Liste abspeichere, die ich später durchlaufen werde.

-Code für die POST unter:

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: In Bezug auf doppelten Kommentar unten Der Fehler, den ich empfangen habe, ist etwas anders. Ich verstehe das Prinzip davon, aber mein .getRespondeCode ist außerhalb meiner for-Schleife, und es sollte durchlaufen werden. Aber es ist nicht.

Dieser Fehler tritt auf, wenn objects.size> = 2

Ich muss die Server-Antwort-String erhalten für jedes Objekt POSTed, da sie eine ID enthält i analysieren müssen.

+1

Mögliches Duplikat [schreiben Kann nicht ausgegeben nach der Eingabe zu lesen] (http://stackoverflow.com/questions/11413028/cannot-write-output-after-reading-input) – e4c5

Antwort

1

Das HTTP-Protokoll basiert auf einem Anfrage-Antwort-Muster: Sie senden Ihre Anfrage zuerst und der Server antwortet. Sobald der Server geantwortet hat, können Sie keinen weiteren Inhalt senden, das würde keinen Sinn ergeben.

Sehen Sie sich Ihren Code an, Sie bekommen die Antwort in for-Schleife. Wenn auf eine Antwort zugegriffen wird, wird beim nächsten Mal die Schleifenausnahme ausgelöst. Wenn Sie mehrere Anfragen erstellen möchten, sollten Sie jedes Mal eine neue URL-Verbindung erstellen. Beispielsweise.

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

Vielen Dank dafür. Ich habe es etwas anders gemacht, aber das hat mich auf den richtigen Weg gebracht! – Noodelz

Verwandte Themen