6

AppEngine에서 호스팅되는 간단한 Restlet 서비스가 있습니다. 이것은 문자열에 대한 기본적인 CRUD 연산을 수행하며, 모든 verb에 대해 curl로 테스트 할 때 모든 종류의 UTF-8 문자로 잘 작동합니다.GAE에서 Restlet에 의해 UTF-8 문자열이 뒤섞임

이 다른 AppEngine에 응용 프로그램에 서블릿에서 호스팅 간단한으로 Restlet 클라이언트에 의해 소비된다

// 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와 아약스를 통해 호출하고, 내가 돌아올 json으로 잘 형성 및 모든하지만, 문제는 예를 들어,이 UTF-8로 인코딩 된 문자열을 다시 스크램블오고있다 : Université de MontréalUniversit?? de Montr??al된다.

나는 (다른 모든 전) 서블릿이 줄을 추가 시도 :

resp.setCharacterEncoding("UTF-8"); 

그러나 유일한 diference 내가 (Universitᅢᄅ de Montrᅢᄅal을 얻을 대신 ??를 얻는 심지어 캐릭터의 어떤 종류의 사람들을 알 수 없다는 것입니다 나는 아시아 인이다).

줄 단위로 디버깅하는 것 외에도 curl을 사용하여 cmd 줄에서 테스트 할 수 있고 잘 구성된 문자열을 반환하기 때문에 리무 팅 서비스가 정상적으로 작동합니다.

firefox (자바 스크립트를 통해 서블릿을 호출 할 때)의 응답 헤더를 보면 예상대로 인코딩이 실제로 UTF-8임을 알 수 있습니다. 가능한 모든 관련 기사를 읽으려고 애쓰는 데 수 시간이 걸려서 나는 this restlet discussion을 만나고 실제로 응답의 http 헤더에 Transfer-Encoding: chunked이 있음을 알았습니다. 내가 제안 된 솔루션을 시도 (ClientResource.setRe​questEntityBuffering​(true)와 susggested으로 내가으로 Restlet 2.1을 시도 좋은하지 않았다, 재정 ClientResource.toRepresentation을, 어떤이 행운 중 하나) 내 문제를 확신하고 있지 않다 그러나 모든에서Transfer-Encoding: chunked관련이 없습니다.

이 시점에서 나는 아이디어가 부족합니다. 정말로은 어떤 제안에 감사드립니다! 나는 고전 URLConnection의와 수동 GET을하고 시도하고 문자열이 다시 괜찮아오고있다

: UPDATE

O_O ...

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

그래서 많은 편안하고 팬시 모든 것에 대해 있지만, 아직도 나는 원래 버전이 작동하지 않는 이유를 전혀 모른다! :/

+1

청크 분할 전송 인코딩은 문자 세트 문제와 관련이 없어야합니다. 질문의 원시 문자열을'resp.getWriter()'에 쓰고, restlet을 완전히 우회하면 올바르게 전송됩니까? – bdonlan

+0

당신은 서블릿에서 내 서비스에 '수동'GET을하는 것을 의미합니까? – JohnIdol

+0

업데이트를 참조하십시오. 내가 restlet을 우회하면 정상적으로 작동합니다. 나는 그것이 restlet 버그 또는 smt O_o 같아요 – JohnIdol

답변

1

나는 고전 URLConnection의와 수동 GET을하고 시도하고 문자열이 다시 괜찮아오고있다 :

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

그래서 많은 편안하고 팬시 모든 것에 대해 ...하지만 여전히 나는 단서가 없다 왜 원래 버전 작동하지 않습니다! :/

0

응답에 적절한 "Content-Type"헤더가 포함되어 있습니까? 그것은 "Content-Type: application/json; charset=UTF-8"과 같아야합니다 (charset에주의하십시오).

개발 서버를 시작하고 cURL을 사용하여 명령 줄에서 리소스를 검색하고 헤더를 검사하십시오. 예 : curl -i http://localhost:8080/myentity/id. 이론적으로 브라우저는 JSON 용 UTF-8을 가정해야하지만, 나는 그것을 신뢰하지 않을 것이다.