2017-10-17 3 views
0

Ich habe ein Dienstprogramm für die Integration von Daten und ein Problem aufgetreten, wenn Sonderzeichen wie "Ã" verwendet werden. Unten ist die fragliche Methode, wo das Problem auftritt. Die Antwort stammt von einer API und ist im XML-Format.HTTPGet Unicode-Zeichen in Antwort String

protected String getStringHttpContent(URI url, Map<String,String> headerParameters) throws IOException 
    { 
     HttpGet request = new HttpGet(url); 
    for(String parameter : headerParameters.keySet()) 
      request.setHeader(parameter, headerParameters.get(parameter)); 

     CloseableHttpResponse response = getClient().execute(request); 
     dumpHeaders(response); 
     BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8")); 
     StringBuffer sb = new StringBuffer(); 
     String output; 
     while ((output = br.readLine()) != null) { 
      sb.append(output); 
     } 
    response.close(); 
     return sb.toString(); 

    } 

Das Ergebnis von njìmientill in der Antwortzeichenfolge ist njämientill. Ich habe versucht, die Codierung zu ändern, aber das Ergebnis bleibt gleich. Jeder Rat würde geschätzt werden.

+0

Haben Sie überprüft, welche Zeichencodierung - falls vorhanden - die Gegenstelle über die Antwort-Header anzeigt? – CBroe

+0

Ja, die Kodierung kommt als gzip. Ich habe versucht, dies zu berücksichtigen, indem ich die entsprechende Kopfzeile für gzip hinzufüge, aber das Ergebnis bleibt gleich. – Filiper

Antwort

0

Stellen Sie sicher, dass Sie UTF-8 Codierung Ende-zu-Ende (über die gesamte Kette) verwenden. Dazu gehören Webseiten und Benutzereingaben, wenn sie beispielsweise von einem HTML-Formular kommen, UTF-8 auf Seiten setzen, Webdienste (web.xml, sun-web.xml oder so). Auch Inbound HttpRequest sollte das Header-Attribut "charset" enthalten, z. "Inhaltstyp: text/html; charset = utf-8". Die Art, wie Sie serverseitig und clientseitig konfigurieren, hängt von den verwendeten Technologien ab (die ich nicht kenne).

BEARBEITEN: In Bezug auf Ihren Kommentar sollten Sie, selbst wenn Sie der Client sind, den Inhaltstyp festlegen, um zu definieren, welche Art von Inhalt Sie vom Server erwarten (da dieser möglicherweise unterschiedliche Inhalte gleichzeitig bereitstellen kann) URL).

Bitte versuchen Sie konfigurieren Ihr HttpGet mit:

request.setHeader(HttpHeaders.CONTENT_TYPE, "application/xml; charset=utf-8"); 

oder (wenn der Server ist ziemlich alt):

request.setHeader(HttpHeaders.CONTENT_TYPE, "text/xml; charset=utf-8"); 

besser, vielleicht den Header akzeptieren geben zusammen mit dem akzeptierten charset:

request.setHeader("Accept-Charset", "utf-8"); 
request.setHeader("Accept", "application/xml"); 

Wenn keine dieser funktioniert, empfehle ich Ihnen, zeigen Sie Ihre Postman-Abfrage hier oder tun ein Wireshark-Capture, um die tatsächliche Anfrage und Antwort zu sehen, sowie den Inhalt der headerParameters Karte. Sonst können wir dir nicht weiterhelfen (wie der Rest deines Codes meiner Meinung nach gut aussieht).

+0

Danke, ich habe das schon oft versucht, aber das Ergebnis bleibt gleich. Ich habe keinen Zugriff auf den Server, der die Antwort liefert, da es sich auf einer Client-Site befindet, aber mit einem einfachen API-Get-Tool wie Postbote habe ich dieses Problem nicht. – Filiper

+0

Bearbeitet. Hoffe es hilft .. – bsaverino

+0

Danke nochmal, leider ändert sich die Antwort nicht. In Bezug auf die Karte, für diese Anfrage, hat es einfach "Accept Content: application/xml". Unten ist die Kopfzeile des Postboten minus der Cookies. Content-Encoding → gzip Content-Type → application/xml Datum → Sun, 22. Oktober 2017 16.30.00 GMT Server → ServiceNow Strict-Transport-Sicherheit → max-age = 63072000; includeSubDomains Transfer-Encoding → chunked X-Ist-eingeloggt → true – Filiper