我想将数据作为字符串发送到Android应用程序的api,但是当我以字符串形式发送大量数据时,它会向我显示此错误" java.net.ProtocolException:content-length承诺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();
}
}
}
答案 0 :(得分:5)
我认为这是关于getBytes()
使用它时要小心,因为你必须传递像.getBytes("UTF-8")
如果您没有传递任何参数,它将使用系统默认值。
我有根据的猜测是,您的数据不是标准的UTF-8数据,因此您应该提供正确的字符集,我认为您的数据长度将匹配。
编辑: 现在,我看到了你的错误。
设置
时wr.writeBytes(postStr);
它再次错误地设置编码:) 你应该这样做:
wr.write(postStr.getBytes("UTF-8"));
p.s:您应该将“UTF-8”更改为支持您的语言的任何内容,以便正确地在服务器端获取数据。