【问题标题】:android resttemplate +httpclient header encoding problemsandroid resttemplate +httpclient header 编码问题
【发布时间】:2013-01-19 23:57:00
【问题描述】:

Android 客户端,使用 Springs resttemplace 和 Apache 通用 HTTP 客户端发出请求。

我正在处理一个服务器,它有时会返回一个 401 错误,并带有一个 http 标头字符串,“ERROR”包含一个用户信息字符串。该字符串取决于语言,因此它可能包含例如斯堪的纳维亚字符。

该字符串在我的 IOS 应用程序中看起来很好,当我在 Firefox RESTclient 插件中检查它时也是如此。

但是,在我的 Android 应用程序中,我一辈子都无法正确显示字符。如果有人能想出一种方法来使数据正确显示,我将不胜感激。

服务器发送内容类型为 UTF-8,它在设置我尝试检索的参数的 httpservletresponse 上的常规 .setHeader()。

这是在我的 Android 客户端中创建我的 resttemplate(我尝试了大多数方法,如您所见):

    HttpClient httpClient = new HttpClient();
    Credentials defaultcreds = new UsernamePasswordCredentials(msisdn, password);
    httpClient.getState().setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM), defaultcreds);
    httpClient.getParams().setSoTimeout(prefs.getServerTimeout());
    httpClient.getParams().setConnectionManagerTimeout(3000);
    httpClient.getParams().setContentCharset("utf-8");
    httpClient.getParams().setCredentialCharset(prefs.getCredentialsEncoding());
    httpClient.getParams().setHttpElementCharset("utf-8");
    httpClient.getParams().setUriCharset("utf-8");
    CommonsClientHttpRequestFactory requestFactory = new CommonsClientHttpRequestFactory(httpClient);
    requestFactory.setReadTimeout(prefs.getServerTimeout());
    RestTemplate restTemplate = new RestTemplate(requestFactory);
    // Add message converters
    List<HttpMessageConverter<?>> mc = restTemplate.getMessageConverters();
    MappingJacksonHttpMessageConverter json = new MappingJacksonHttpMessageConverter();

    List<MediaType> supportedMediaTypes = new ArrayList<MediaType>();
    supportedMediaTypes.add(MediaType.APPLICATION_JSON);
    json.setSupportedMediaTypes(supportedMediaTypes);
    mc.add(json);
    restTemplate.setMessageConverters(mc);

    // Set our specific error handler
    restTemplate.setErrorHandler(new MyErrorHandler());

这是我的 http 响应,如果我在那里运行相同的请求,则从 Firefox 中的 restclient 复制:

Status Code: 401 Unauthorized
Content-Length: 954
Content-Type: text/html;charset=utf-8
Date: Sat, 19 Jan 2013 23:53:10 GMT
ERROR: För att <contents cut out but as you see Scandinavian char looks fine here >
Server: Apache-Coyote/1.1
WWW-Authenticate: Basic realm="rest"

【问题讨论】:

    标签: android http apache-commons-httpclient resttemplate


    【解决方案1】:

    HTTP 标头使用 ASCII(或者,在旧规范中,Latin-1)。将其他编码放入标头可能会或可能不会起作用。

    【讨论】:

    • 是的,我在某些规范中看到了这一点,US-ascii。我只是不明白为什么它在 IOS 和 Firefox 中工作......知道我可以做些什么来让我的 Android 应用程序将标题读取为 UTF-8 吗?
    【解决方案2】:

    您的响应内容类型似乎是 text/html。您是否尝试在请求标头中设置 Content-Type 和字符集,如下所示?根据文档here

    使用HTTP传输的文本类型的文档,如text/html、text/plain等,可以在HTTP头中发送一个charset参数来指定文档的字符编码。

    LinkedMultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>();
    headers.set("Content-Type", "text/html;charset=utf-8");
    HttpEntity request = new HttpEntity(null, headers);
    ResponseEntity<Person> response = template.exchange(url,
                    HttpMethod.GET, request, Person.class);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-02
      • 1970-01-01
      • 2019-01-22
      • 2011-05-25
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多