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"
答案 0 :(得分:0)
HTTP标头使用ASCII(或者,在较旧的规范中,使用Latin-1)。将其他编码放入标题中可能会也可能不起作用。
答案 1 :(得分:0)
您的响应内容类型似乎是text / html。您是否尝试在请求标头中设置Content-Type和charset,如下所示?根据文档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);