当前位置: 首页 > 面试题库 >

Java HttpClient更改内容类型?

田佐
2023-03-14
问题内容

我正在为我的Android手机构建一个小型应用程序,以使用非常基本的REST界面将短信转发到网络服务器。

我正在使用android 4.0.3 SDK。我使用Django和Django
restframework包在python中开发了Web服务。设置完全是开箱即用的。基本上有一个端点可以接收包含消息信息(发送者,正文,日期)的JSON对象的POST。我已经使用cURL通过以下命令测试了该服务:

curl -X POST -H 'Content-Type: application/json' --data '{"sender":"+xxxxxxxx", "body": "test", "send_date":"2011-03-20 16:32:02"}' http://[...]/messages.json

一切正常,我得到了预期的响应:

{"body": "test", "send_date": "2011-03-20T16:32:02", "id": 25, "sender": "+xxxxxxxxxx"}

现在,我设置了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();
    }


}

如您所见,我刚刚开始熟悉Java和android SDK,所以请多多包涵。实际上,此设置在我构建的用于将JSON字符串发送到Neo4J
Web服务的另一个应用程序中可以正常工作。

问题是,当我通过Android将消息发布到我的Web服务时,有时内容类型从’application / json’更改为’application /
json,application / json’。标头循环中的日志条目仍然为每个标头输出正确的值,但是,Web服务返回以下错误消息:

{"error": "Unsupported media type in request 'application/json, application/json'."}

我很困惑,欢迎任何帮助。


问题答案:

更改此:

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


 类似资料:
  • 我有这个代码: 当我运行它时,我在控制台上得到以下打印: 因此,它返回415个不受支持的媒体类型错误代码。 我在StackOverflow上发现,它可能是由上下文类型中的charset=UTF-8引起的。所以我的问题是,我如何编辑这个字段来满足我的需求(删除charset=UTF-8)。链接 如何更改该内容类型。由于我不熟悉HTTP协议,请详细说明。

  • 我正在为我的Android手机构建一个小应用程序,使用非常基本的REST界面将短信转发到网络服务器。 我正在使用android 4.0.3 SDK。我使用Django和Django restframework包在python中开发了webservice。设置完全是开箱即用的。基本上只有一个endpoint接收包含消息信息(发件人、正文、日期)的JSON对象的帖子。我使用cURL和以下命令测试了该服

  • 我有一本书。NETCore2.0WebAPI应用程序,其中我将“Flurl.Http”(版本2.1.0)NuGet包添加到我的项目中。 我正在尝试使用Flurl对一个VisualStudioTeamServices(VSTS)APIendpoint进行简单的RESTAPI调用。 但是,我正在调用的特定VSTS api终结点要求将Content-Type设置为“应用程序/json-补丁json”,而

  • 问题内容: 我的JTable有问题。我的JTable显示数据库的内容。一个数据库表具有名称类别。每个类别都显示在JComboBox中。如果单击类别,则应该更新表内容。 这是我的代码的简短摘要,因此可以更轻松地为我提供帮助。该代码应可运行: (TestClass-主要) (如果需要,则为TestTableModel-AbstractTableModel(您需要它来执行代码!) 使用此短代码,如果更改

  • 问题内容: 我有一些JavaScript的简单HTML代码,看起来像: 我只是希望能够通过选择“ A”或“ B”单选按钮之一来更改div的内容(它是内部html),但是div#content没有javascript属性“ value”,所以我问它如何做完了。 问题答案: 假设您没有使用jQuery或其他使您更轻松地进行此类操作的库,则只需使用元素的innerHTML属性即可。

  • 问题内容: 请原谅我,但我可能不熟悉正确询问此问题所需的所有术语。 我正在使用jax-rs 的实现在Java中使用一个相当简单的REST Web服务。方法头是这样的: MessageContext在哪里。 我要完成的两件事似乎无法弄清: 如果满足某些条件(例如,出现错误),则更改内容类型 更改响应的状态码 我尝试通过通过MessageContext访问响应来更改响应: 但是这些变化与发送的响应无关