Java HttpClient正在更改内容类型?

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

我正在为我的Android手机构建一个小应用程序,使用一个非常基本的REST界面将文本消息转发到Web服务器

我正在使用android 4.0.3 SDK。我使用Django和Django restframework包在python中开发了webservice。设置完全是开箱即用的。基本上只有一个端点接收包含消息信息(发件人、正文、日期)的JSON对象的帖子。我使用cURL和以下命令测试了该服务:

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));