2

API に POST しようとしているオブジェクトの配列があります。最初のオブジェクトは正常に通過し、次のようになります。

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

私はそれが私が物事を行っている順序に過ぎないと確信していますが、私はまだAndroidを学んでおり、今から1時間少し理解しようとしています.

私はあなたたちに助けを求めると思いました!POST への各応答を受信する必要があるため、ID フィールドを後で使用するためにそれを psrse できます。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 ループの外側にあり、循環する必要があります。しかし、そうではありません。

このエラーは、objects.size>=2 の場合に発生します

解析する必要がある ID が含まれているため、POST された各オブジェクトのサーバー応答文字列を取得する必要があります。

4

1 に答える 1

4

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
    }
于 2016-05-17T04:50:17.077 に答える