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.setRequestEntityBuffering(true)
, senza fortuna neanche lì), ma non mi convince il mio problema è legato allaTransfer-Encoding: chunked
affatto.
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! :/
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
Vuoi dire facendo un 'manuale' OTTIENI al mio servizio dal servlet? – JohnIdol
Vedere l'aggiornamento, funziona correttamente se ignoro il restlet. Immagino sia un bug di restlet o smt O_o – JohnIdol