Не удается заставить работать кодировку символов из клиента Android с помощью resttemplate и json - PullRequest
0 голосов
/ 02 февраля 2012

Хорошо, так что я попробовал все, но спрашивал в stackoverflow ...

Я пытаюсь выполнить вызов REST с некоторыми параметрами http от Android, используя httpclient, и переставить шаблон на серверный контроллер Spring.Все мои шведские символы заканчиваются на сервере как «\ u001A» ...

с настройкой кода httpclient и повторной установки шаблона:

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().setContentCharset(prefs.());
httpClient.getParams().setCredentialCharset(prefs.getCredentialsEncoding());

CommonsClientHttpRequestFactory requestFactory = new CommonsClientHttpRequestFactory(httpClient);

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

return restTemplate;

Затем я готовлю httpentity с моим параметром:

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.add("myparam", "" + "å");
HttpEntity<String> entity = new HttpEntity<String>(headers);

Наконец, я делаю вызов остальных:

ResponseEntity<UserStatusTO> response = rest.exchange(url, HttpMethod.GET, entity,
            MyResponseClass.class);

На сервере у меня установлен десериализатор Джексона, и мой метод пружинного контроллера выглядит так:

@RequestMapping(method = RequestMethod.GET, value = "/event/out", headers = "Accept=application/json", produces = {"application/xml;charset=UTF-8", "application/json;charset=UTF-8"})
public
@ResponseBody
UserStatusTO out(Authentication auth, @RequestHeader(value="myparam", required =  false) String myparam) {

Всеспециальные символы заканчиваются как \ u001a!Я пробовал кучу вещей, перекодировав строки вручную на стороне клиента И на сервере, ни одна не работала.Я попытался возиться с httpClient.getParams (). SetContentCharset ();httpClient.getParams (). setUriCharset ();

Насколько я могу судить, ничего не получилось.

У меня нет идей!Если у кого-то есть вклад, я был бы очень благодарен.Спасибо!

Ответы [ 2 ]

4 голосов
/ 28 марта 2012

У меня была похожая проблема, и я исправил ее, установив правильный набор символов И для типа контента вручную вместо MediaType.APPLICATION_JSON:

HttpHeaders headers = new HttpHeaders();
Charset utf8 = Charset.forName("UTF-8");
MediaType mediaType = new MediaType("application", "json", utf8);
headers.setContentType(mediaType);
1 голос
/ 02 февраля 2012

Это похоже на проблему на стороне сервера, поскольку HTTP-клиент Apache с радостью выведет символы Latin-1 в заголовках, как вы можете проверить с помощью этого простого теста:

HttpGet get = new HttpGet("http://www.riksdagen.se");
get.addHeader("SwedishHeader", "Mona Sahlin är ett nötdjur");

ByteArrayOutputStream out = new ByteArrayOutputStream();
SessionOutputBufferImpl buffer = new SessionOutputBufferImpl(out, get.getParams());
HttpRequestWriter writer = new HttpRequestWriter(buffer, BasicLineFormatter.DEFAULT, get.getParams());

writer.write(get);
buffer.flush();
System.out.println(out.toString("ISO-8859-1"));

SessionOutputBufferImpl - это небольшой взлом, чтобы использовать AbstractSessionOutputBuffer

class SessionOutputBufferImpl extends AbstractSessionOutputBuffer {
    SessionOutputBufferImpl(OutputStream out, HttpParams params) {
        init(out, 1024, params);
    }
}

Вам, вероятно, следует сконцентрироваться на серверной части сервера - что вы используете? Если он «исправлен» - вам следует попробовать отформатировать заголовок в соответствии с RFC 2407 - некоторые серверы поддерживают, другие с треском проваливаются.

...