2012-02-02 4 views
0

Ok, так ив попробовал все, но спрашивать у StackOverflow ...Невозможно получить кодировку для работы с андроид клиента с resttemplate и JSON

Я пытаюсь выполнить REST вызов с некоторыми HTTP Params из Android с помощью httpclient и resttemplate для серверного контроллера Spring. Все мои шведские символы в конечном итоге на сервере как '\' u001A ...

настройки HttpClient и 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().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();

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

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

+0

для «MyParam» заголовка, где вы зубрежки в исключением å, ä: s и ö: s? – Jens

+0

Ну, есть только один параметр, который имеет swedish символы. Я сократил свой пример, чтобы упростить его чтение, но в моем приложении есть поле, где пользователь может ввести заметку, которую я пытаюсь отправить на сервер ... Но место, где у меня есть «å», где i в моем коде помещается в текст из текстового поля – Mathias

ответ

1

Это звучит как вопрос на стороне сервера, так как клиент Apache HTTP с удовольствием вывода 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 - некоторые серверы поддерживают, другие терпят неудачу.

+0

Прошу прощения, но я могу подтвердить, что это не сервер. Я провел день, обновляя свое приложение IOS с одинаковой функциональностью, и тексты поступают нормально, закодированы должным образом, и все символы выглядят нормально в базе данных, где они заканчиваются ... – Mathias

+0

Проводили ли вы подключение к серверу и проверяли различия в кодировке? – Jens

4

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

HttpHeaders headers = new HttpHeaders(); 
Charset utf8 = Charset.forName("UTF-8"); 
MediaType mediaType = new MediaType("application", "json", utf8); 
headers.setContentType(mediaType); 

 Смежные вопросы

  • Нет связанных вопросов^_^