6

Ho un semplice servizio di Restlet ospitato su AppEngine. Questo esegue operazioni CRUD di base con stringhe e funziona bene con tutti i tipi di caratteri UTF-8 quando lo collaudo con arricciatura (per tutti i verbi).Le stringhe UTF-8 vengono rimescolate da Restlet su GAE

Questo è consumata da un semplice client Restlet ospitato in un servlet su un'altra applicazione 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()); 

È possibile che questo è più o meno tutto quello che ho nella servlet. Molto semplice

Il servlet viene richiamato tramite jquery ajax, e il JSON che torno è ben formata e tutto, ma il problema è che le stringhe UTF-8 codificati stanno tornando strapazzate, ad esempio: Université de Montréal diventa Universit?? de Montr??al.

Ho provato ad aggiungere questa riga nel servlet (prima di tutto):

resp.setCharacterEncoding("UTF-8"); 

Ma l'unica diference è che invece di ottenere ?? ottengo Universitᅢᄅ de Montrᅢᄅal (io non so nemmeno che tipo di personaggi coloro sono, suppongo asiatico).

Sono sicuro al 100% che il servizio di ripristino sia corretto, perché oltre a eseguire il debug di riga per riga, sono in grado di verificarlo dalla linea di cmd con il ricciolo e restituire stringhe ben formate.

Guardando l'intestazione http della risposta da firefox (quando si chiama il servlet tramite javascript) posso vedere che la codifica è effettivamente UTF-8, come previsto. Dopo ore di lettura incontrollata di ogni possibile articolo correlato mi sono imbattuto in this restlet discussion e ho notato che effettivamente ho Transfer-Encoding: chunked sull'intestazione http della risposta. Ho provato le soluzioni proposte (Override ClientResource.toRepresentation, non ha fatto nulla di buono, così ho provato Restlet 2.1 come susggested con ClientResource.setRe​questEntityBuffering​(true), senza fortuna neanche lì), ma non mi convince il mio problema è legato allaTransfer-Encoding: chunkedaffatto.

A questo punto sono fuori di idee, e vorrei davvero apprezzare qualsiasi suggerimento! O_o

UPDATE:

ho provato a fare un GET manuale con un URLConnection classico e la stringa è tornato a posto:

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

Tanto per essere tutti RESTful e fantasia ... ma ancora non ho idea del perché la versione originale non funziona! :/

+1

La codifica di trasferimento Chunked non dovrebbe essere correlata ai problemi di charset ... Se si scrive la stringa non elaborata in questione a 'resp.getWriter()', ignorando completamente il restlet, viene trasferito correttamente? – bdonlan

+0

Vuoi dire facendo un 'manuale' OTTIENI al mio servizio dal servlet? – JohnIdol

+0

Vedere l'aggiornamento, funziona correttamente se ignoro il restlet. Immagino sia un bug di restlet o smt O_o – JohnIdol

risposta

1

ho provato a fare un GET manuale con un URLConnection classico e la stringa è tornato a posto:

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

Tanto per essere tutti RESTful e fantasia ... ma ancora non ho idea perché la versione originale non funziona! :/

0

La risposta contiene l'intestazione "Content-Type" appropriata? Dovrebbe essere qualcosa come "Content-Type: application/json; charset=UTF-8" (nota il set di caratteri).

Provare ad avviare il server di sviluppo e recuperare la risorsa dalla riga di comando utilizzando cURL e ispezionando le intestazioni, ad es. curl -i http://localhost:8080/myentity/id. In teoria i browser dovrebbero assumere UTF-8 per JSON, ma non mi fiderei di ciò.

Problemi correlati