UTF-8 Струны зашифрованы рестлетом на GAE - PullRequest
6 голосов
/ 31 декабря 2011

У меня есть простой сервис Restlet, размещенный на AppEngine.Это выполняет основные операции CRUD со строками и хорошо работает со всеми видами символов UTF-8, когда я тестирую его с помощью curl (для всех глаголов).

Это используется простым клиентом рестлета, размещенным в сервлетев другом приложении AppEngine:

// set response type
resp.setContentType("application/json");
// Create the client resource
ClientResource resource = new ClientResource(Messages.SERVICE_URL + "myentity/id");
// Customize the referrer property
resource.setReferrerRef("myapp");
// Write the response
resource.get().write(resp.getWriter());

Это почти все, что у меня есть в сервлете.Очень просто.

Сервлет вызывается через jquery ajax, и возвращаемый мне json правильно сформирован и все, но проблема в том, что строки в кодировке UTF-8 возвращаются обратно зашифрованными, например: Université de Montréal становится Universit?? de Montr??al.

Я попытался добавить эту строку в сервлете (прежде всего):

resp.setCharacterEncoding("UTF-8");

Но единственное отличие состоит в том, что вместо получения ?? я получаю Universitᅢᄅ de Montrᅢᄅal (я нея даже не знаю, что это за символы, я полагаю, азиат).

Я на 100% уверен, что служба перезапуска в порядке, потому что кроме отладки ее построчно, я могу протестировать ее из строки cmd сcurl и он возвращает правильно сформированные строки.

Просматривая заголовок http ответа от firefox (при вызове сервлета через javascript), я вижу, что кодировка действительно UTF-8, как и ожидалось.После нескольких часов трудного чтения каждой возможной связанной статьи я наткнулся на это повторное обсуждение и заметил, что у меня действительно есть Transfer-Encoding: chunked в заголовке http ответа.Я попробовал предложенные решения (переопределить ClientResource.toRepresentation, ничего не помогло, поэтому я попробовал перезагрузить 2.1, как предложено с ClientResource.setRe​questEntityBuffering​(true), там тоже не повезло), но Я не уверен, что моя проблема связана с Transfer-Encoding: chunked вообще .

На данный момент у меня нет идей, и я бы действительно оценил бы любые предложения!O_o

ОБНОВЛЕНИЕ :

Я попытался выполнить GET вручную с классическим UrlConnection, и строка возвращается в порядке:

URL url = new URL(Messages.SERVICE_URL + "myentity/id");
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();

StringWriter writer = new StringWriter();
IOUtils.copy(is, writer, "UTF-8");

resp.getWriter().print(writer.toString()); 

Так многоза то, что все RESTful и причудливо ... но я все еще не понимаю, почему оригинальная версия не работает!: /

Ответы [ 2 ]

1 голос
/ 07 августа 2012

Я попытался выполнить GET вручную с классическим UrlConnection, и строка возвращается в порядке:

URL url = new URL(Messages.SERVICE_URL + "myentity/id");
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();

StringWriter writer = new StringWriter();
IOUtils.copy(is, writer, "UTF-8");

resp.getWriter().print(writer.toString());

Так много для того, чтобы быть RESTful и причудливым ... но все же я понятия не имею, почему оригинальная версия не работает! : /

0 голосов
/ 24 марта 2012

Содержит ли ваш ответ соответствующий заголовок "Content-Type"? Это должно быть что-то вроде "Content-Type: application/json; charset=UTF-8" (обратите внимание на кодировку).

Попробуйте запустить сервер разработки и извлечь свой ресурс из командной строки, используя cURL, и проверить заголовки, например. curl -i http://localhost:8080/myentity/id. Теоретически браузеры должны предполагать UTF-8 для JSON, но я бы не стал доверять этому.

...