2013-01-19 67 views
1

Android客户端,使用Springs resttemplace和Apache公共HTTP客户端发出请求。android resttemplate + httpclient头文件编码问题

我正在对服务器,有时返回401错误,与http头字符串,“错误”,其中包含用户信息字符串。该字符串是与语言相关的,因此它可能包含斯堪的纳维亚字符。

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

但是,在我的Android应用程序中,我不能让我的生活得到正确的字符。如果有人能想到我可以使数据正确出来的方式,我将非常感激。

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

这是我在我的Android客户端resttemplate的创建(IVE尝试的大多数方法,你可以看到):

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响应,从RESTClient实现在Firefox中复制,如果我跑了同样的要求有:

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" 

回答

0

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

+0

是的,我在一些规范中看到,US-ascii。我只是没有得到它为什么在IOS和Firefox工作...有什么想法让我的Android应用程序读取标题为UTF-8? – Mathias

0

您的回复内容类型看起来像是text/html。您是否尝试在请求标题中设置Content-Type和charset,如下所示?根据文档here

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

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