Jackson-Jackson + HttpPost="Ungültiges UTF-8-Middle-Byte", Einstellung von Mime und Encoding

8

Ich verwende die Apache HTTP Client-Bibliotheken und Jackson in meinem Client. Wenn ich JSON auf dem Server posten, erhalte ich den Fehler:

%Vor%

Wenn ich keinen Header setze, bekomme ich invalid media type , was Sinn macht.

Wenn ich curl und die gleichen Header verwende, akzeptiert der Server es, also denke ich, dass der Server in Ordnung ist (und nur zufällig, dass es auch Jackson benutzt)

Dies ist das Dokument; Ich habe es hart als Java-Literal mit nur 8-Bit-Zeichen codiert, um jeden anderen Ort zu vermeiden, an dem Mangeln passieren kann.

%Vor%

Hier ist der Code, den ich benutzt habe, und Kommentare zu den verschiedenen Versuchen:

%Vor%

Andere seltsame Dinge, die ich bemerkt habe:

  • Das hat sich auf Eclipse auf dem Mac eine Weile anders verhalten als auf Linux unter .jar; klar, das ist ein Symptom plattformspezifischer Kodierung oder Dekodierung, aber ich weiß nicht wo. Ironischerweise ist das kaputt , wenn ich Eclipse so eingestellt habe, dass Code als UTF-8 behandelt wird (vs. ASCII). Ich vermute, das ist ein wichtiger Hinweis, aber nicht sicher, wo er passt.
  • Ich habe mal gesehen, dass statt 2 Bytes 4 Bytes im Stream sind, obwohl das beim Schreiben auf die Festplatte vielleicht ein anderes Kodierungsproblem war, obwohl ich speziell UTF-8 auf Datei IO eingestellt habe
  • Wenn ich die Zeichenfolgenentität im Debugger anschaue, sehe ich die Bytes, aber das 8-Bit-Zeichen ist eine negative Zahl. Wenn Sie die Zwei-Kompliment-Mathematik durchlaufen, ist es immer noch der korrekte Unicode-Codepunkt, also nominell OK, vorausgesetzt, dass httpclient nicht fehlerhaft ist.

Wirklich aus Ideen, und wie gesagt, es funktioniert mit curl, also denke ich, der Server ist in Ordnung.

Bearbeiten:

curl funktioniert beim Posten auf dem Server, aber ich kann den Servercode nicht teilen. Es wurde darauf hingewiesen, dass, da curl nicht in Java geschrieben ist und sich daher möglicherweise anders verhält und daher der Servercode immer noch verdächtig sein könnte.

Als weiteren Test verwendet der folgende Code NICHT die Apache-httpclient-Bibliothek und funktioniert bei der Veröffentlichung auf dem Server. Dies beweist, dass der Server in Ordnung ist und es immer noch nicht stimmt, wie ich die Apache-Bibliothek auf der Client-Seite verwende (oder vielleicht ist sie fehlerhaft).

Nicht-apache-httpclient-Code, der funktioniert:

%Vor%     
Mark Bennett 09.05.2014, 21:09
quelle

1 Antwort

12

Es sieht so aus, als ob das Problem darin besteht, wie der ContentType -Parameter für den StringEntity -Konstruktor des HttpClients erstellt wird.

Die Verwendung der ContentType.APPLICATION_JSON -Konstante als Parameter (was dem "mime-Typ" application / json; charset = utf-8 "entspricht) sorgt dafür, dass alles funktioniert.

Hier ist ein Beispiel, das die JSON-Zeichenfolge an einen öffentlichen http-Dienst sendet, der die Anfrage an den Client zurückgibt:

%Vor%

Ausgabe:

%Vor%     
Alexey Gavrilov 10.05.2014, 20:56
quelle

Tags und Links