[android]java.net.ProtocolException︰ 内容长度承诺 16280 字节,但收到 16272

发布时间: 2017/3/18 15:04:21
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我想要将数据作为字符串发送给从 api android 应用程序,但当我以字符串形式发送的数据量大时它显示我此错误"java.net.ProtocolException︰ 内容长度承诺 16280 字节,但收到 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:

这是关于getBytes()

要小心,当你使用它,因为你必须通过字符编码参数如.getBytes("UTF-8")

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

我的猜测是,您的数据并非标准的 utf-8 数据,所以你应该给正确的字符集和我认为后将匹配您的数据长度。

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

当您设置

wr.writeBytes(postStr);

它设置的再次:) 编码错误 你应该这样做︰

wr.write(postStr.getBytes("UTF-8"));

︰ 你应该改变"UTF-8"任何支持你的语言来获取您的数据在服务器端正确的事情。

赞助商