Java.net.ProtocolException: 内容长度应为16280字节,但实际接收到的是16272字节。

3
我希望从安卓应用程序将数据作为字符串发送到API,但当我以字符串形式发送大量数据时,它显示以下错误:“java.net.ProtocolException:content-length promised 16280 bytes, but received 16272”。如果我只发送少量数据,就不会出现任何错误。它说了什么内容长度不匹配的问题,我无法理解。
我分享了我的代码,请检查。
enter code here

private class AsyncTaskRunner extends AsyncTask<Void, 
Void, ArrayList<String[]>> {

    private String resp;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        progressBar = new ProgressDialog(getActivity());
        progressBar.setCancelable(true);
        progressBar.setMessage("Fetching Contacts ...");
        progressBar.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        progressBar.show();
    }

    @Override
    protected ArrayList<String[]> doInBackground(Void... params) {


        ContentResolver cr = getActivity().getContentResolver();
        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,
                null, null, null, null);
//        ArrayList<String[]> contacts = new ArrayList<String[]>();
        if (cur.getCount() > 0) {
            while (cur.moveToNext()) {
        String id =cur.getString(cur.getColumnIndex
 (ContactsContract.Contacts._ID));
                String name = cur.getString(cur.getColumnIndex
 (ContactsContract.Contacts.DISPLAY_NAME));

                String phones = null;
                if  (Integer.parseInt(cur.getString(cur.getColumnIndex
 (ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
                    //Query phone here.  Covered next
                    if (Integer.parseInt(cur.getString(cur.getColumnIndex
  (ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
                        Cursor pCur = cr.query(
                                ContactsContract.CommonDataKinds.Phone.
   CONTENT_URI,null,
                                ContactsContract.CommonDataKinds.
    Phone.CONTACT_ID + " = ?",
                                new String[]{id}, null);
                        while (pCur.moveToNext()) {
                            // Do something with phones
                            phones = pCur.getString(pCur.getColumnIndex
   (ContactsContract.CommonDataKinds.Phone.NUMBER));
  //                            String[] str = new String[3];
  //                            str[0] = id;
  //                            str[1] = name;
  //                            str[2] = phones;
  //                            contacts.add(str);

                        }
                        pCur.close();
                    }
                }
                String[] str = new String[3];
                str[0] = id;
                str[1] = name;
                str[2] = phones;
                long val1 = adapter1.insertContacts(id, name, phones);
                JSONObject jsonObject = new JSONObject();
                try {
                    jsonObject.put("name", name);
                    jsonObject.put("phones", phones);
                    jsonArray.put(jsonObject);


                } catch (JSONException e) {
                    e.printStackTrace();
                }

                Log.d("value is", "" + val1);
                contacts.add(str);

            }
        }
        cur.close();
        String name = "Siddhant";
        String postjson = String.valueOf(jsonArray);
        rsp = serviceResponse(postjson, Config.URL_SAVE_CONTACTS);

        Collections.sort(contacts, ALPHABETICAL_ORDER);
        mAllData.addAll(contacts);

        return contacts;
    }

    private Comparator<String[]> ALPHABETICAL_ORDER = 
   new Comparator<String[]>() 
   {
        @Override
        public int compare(String[] lhs, String[] rhs) {
            int res = String.CASE_INSENSITIVE_ORDER.compare(lhs[1], rhs[1]);
            if (res == 0) {
                res = lhs[1].compareTo(rhs[1]);
            }
            return res;
        }
    };

    @Override
    protected void onPostExecute(ArrayList<String[]> result) {
        super.onPostExecute(result);

        adapter = new ContactsListAdapter(getActivity(), contacts);
        listView.setAdapter(adapter);
        progressBar.dismiss();
        if (rsp!=null) {
            String json = rsp.toString();
            Toast.makeText(getActivity(), json, Toast.LENGTH_SHORT).show();
        }
    }
    }

   public String serviceResponse(String postStr, String urlString) {

    HttpURLConnection connection = null;
    try {

   //            original code
   // Create connection
        URL url = new URL(urlString);
        connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-Type", 
    "application/x-www-  form-urlencoded");
   // connection.setRequestProperty("Content-Type", "application/json");

        connection.setRequestProperty
    ("Content-Length", "" +Integer.toString(postStr.getBytes().length));

        connection.setRequestProperty("Content-Language", "en-US");
        connection.setUseCaches(false);
        connection.setDoOutput(false);

   // Send request
        DataOutputStream wr = 
   new    DataOutputStream(connection.getOutputStream());

        wr.writeBytes(postStr);
        wr.flush();
        wr.close();

        int status = connection.getResponseCode();
    // return String.valueOf(status);

        InputStream is;
        if (status >= HttpStatus.SC_BAD_REQUEST)
            is = connection.getErrorStream();
        else
            is = connection.getInputStream();
   // Get Response
        BufferedReader rd = new BufferedReader(new InputStreamReader(is));
        String line;

        StringBuffer response = new StringBuffer();
        while ((line = rd.readLine()) != null) {

            response.append(line);
        }
        rd.close();
        return response.toString();


    } catch (Exception e) {
        e.getMessage();
        return null;

    } finally {

        if (connection != null) {
            connection.disconnect();
        }
    }
    }
1个回答

6

我认为这与getBytes()有关。

使用它时要小心,因为你必须传递字符编码参数,例如.getBytes("UTF-8")

如果不传任何参数,它将使用系统默认值。

我的猜测是你的数据不是标准的UTF-8数据,所以你应该提供正确的字符集,然后我认为你的数据长度就会匹配。

编辑: 现在,我看到了你的错误。

当你设置时:

wr.writeBytes(postStr);

它再次错误地设置了编码 :) 您应该像这样做:
wr.write(postStr.getBytes("UTF-8"));

p.s:你应该将“UTF-8”更改为支持你的语言的编码方式,以便在服务器端正确地获取你的数据。


谢谢你的帮助 Gunhan,我已经更改了它,但错误仍然相同。 - Sid.The.Biker
如果您根本不设置内容长度会发生什么? - Gunhan
仍然发生着这个问题,刚刚我检查了一下,如果我手动添加8个字节,那么就不会出现错误,但是我无法在writebytes()中手动添加更多的字节,所以我不知道该怎么办。 - Sid.The.Biker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接