Java HttpClient正在更改内容类型?
我正在为我的Android手机构建一个小应用程序,使用一个非常基本的REST界面将文本消息转发到Web服务器 我正在使用android 4.0.3 SDK。我使用Django和Django restframework包在python中开发了webservice。设置完全是开箱即用的。基本上只有一个端点接收包含消息信息(发件人、正文、日期)的JSON对象的帖子。我使用cURL和以下命令测试了该服务:Java HttpClient正在更改内容类型?,java,android,django,http-post,Java,Android,Django,Http Post,我正在为我的Android手机构建一个小应用程序,使用一个非常基本的REST界面将文本消息转发到Web服务器 我正在使用android 4.0.3 SDK。我使用Django和Django restframework包在python中开发了webservice。设置完全是开箱即用的。基本上只有一个端点接收包含消息信息(发件人、正文、日期)的JSON对象的帖子。我使用cURL和以下命令测试了该服务: curl-X POST-H'内容类型:application/json'--data'{“send
curl-X POST-H'内容类型:application/json'--data'{“sender”:“+xxxxxxxx”,“body”:“test”,“send_date”:“2011-03-20 16:32:02”}http://[…]/messages.json
这一切都很好,我得到了预期的响应:
{“正文”:“测试”,“发送日期”:“2011-03-20T16:32:02”,“id”:25,“发送人”:“+XXXXXXXXX”}
现在我设置了android应用程序。它是一个简单的BroadcastReceiver子类,包含一个私有AsyncTask类:
private class httpPost extends AsyncTask<String, Void, JSONObject> {
protected JSONObject doInBackground(String... args) {
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
HttpParams myParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(myParams, 10000);
HttpConnectionParams.setSoTimeout(myParams, 10000);
String url = args[0];
String json=args[1];
JSONObject JSONResponse = null;
InputStream contentStream = null;
String resultString = "";
try {
HttpPost httppost = new HttpPost(url);
httppost.setHeader("Content-Type", "application/json");
httppost.setHeader("Accept", "application/json");
StringEntity se = new StringEntity(json);
se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
httppost.setEntity(se);
for (int i=0;i<httppost.getAllHeaders().length;i++) {
Log.v("set header", httppost.getAllHeaders()[i].getValue());
}
HttpResponse response = httpclient.execute(httppost);
// Do some checks to make sure that the request was processed properly
Header[] headers = response.getAllHeaders();
HttpEntity entity = response.getEntity();
contentStream = entity.getContent();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//convert response to string
try{
BufferedReader reader = new BufferedReader(new InputStreamReader(contentStream,"iso-8859-1"),8);
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
contentStream.close();
resultString = sb.toString();
}catch(Exception e){
e.printStackTrace();
}
Log.v("log", resultString);
return new JSONObject();
}
}
私有类httpPost扩展异步任务{
受保护的JSONObject doInBackground(字符串…args){
//创建一个新的HttpClient和Post头
HttpClient HttpClient=新的DefaultHttpClient();
HttpParams myParams=新的BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(myParams,10000);
HttpConnectionParams.setSoTimeout(myParams,10000);
字符串url=args[0];
字符串json=args[1];
JSONObject JSONResponse=null;
InputStream contentStream=null;
字符串resultString=“”;
试一试{
HttpPost HttpPost=新的HttpPost(url);
setHeader(“内容类型”、“应用程序/json”);
setHeader(“接受”、“应用程序/json”);
StringEntity se=新的StringEntity(json);
setContentEncoding(新的BasicHeader(HTTP.CONTENT_TYPE,“application/json”);
httppost.setEntity(se);
对于(int i=0;i更改此值:
StringEntity se = new StringEntity(json);
se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
httppost.setEntity(se);
仅限于此:
httppost.setEntity(new StringEntity(json.toString(), HTTP.UTF_8));
简单:
为什么要写两个“内容类型”标题?一个是http.setHeader,另一个是通过实体。可能是错误的原因。据我所知,第二个是StringEntity只是设置实体的解码,不影响post头。我已经通过不添加post头进行了测试。在这种情况下,请求中结束的头是标准文本/普通头。我不确定这一点,但我会尝试不使用实体。除此之外,还有HTTP嗅探器(如wireshark)可以帮助您诊断故障是在客户端还是服务器上。现在下载wireshark,看看它带来了什么。非常感谢PointerHanks mate!!这就是我所需要的。@SJuan76您也是对的,伙计们,非常有帮助!应该是se.setContentType(新的BasicHeader(HTTP.CONTENT\u TYPE,“application/json”));
添加HTTP.UTF_8作为字符集修复了我的问题…谢谢:)
import org.apache.http.client.methods.HttpPost;
httppost.setEntity(new StringEntity(json.toString(), org.apache.http.entity.ContentType.APPLICATION_JSON));