HTTP-Post-Anfrage stellen mit unterschiedlich kodierten (charset)
Verweis auf die Vorherige Frage: Immer eine ajax-Antwort in java aus einer web-Methode (java).io.FileNotFoundException)
Ich versuche zu senden, einen POST-request mit json in den request-body, aber der Körper ist anders codiert, wenn es von einem web-browser (chrome) und mein java-code.
Hier ist mein code:
String params = "{\"prefixText\":\"aCity\",\"count\":10,\"contextKey\":\"he\"}";
conn = (HttpURLConnection) new URL("http://bus.gov.il/WebForms/wfrmMain.aspx/GetCompletionList").openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setFixedLengthStreamingMode(params.length());
conn.addRequestProperty("Content-Type", "application/json; charset=UTF-8");
conn.addRequestProperty("Referer", "http://bus.gov.il/WebForms/wfrmMain.aspx?width=1024&company=1&language=he&state=");
Writer out = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
out.write(params);
out.close();
String answer = readStream(conn.getInputStream(), "utf-8");
Hier sind die 2 Anfragen, die gesendet werden, wie in Wireshark: link (erste ist die gute, die zweite ist die falsch codierten java-Anfrage).
Ich versucht, die änderung der Zeichenkodierung im Content-Type-aber es Tat nichts.
Jede Hilfe wird sehr geschätzt werden.
InformationsquelleAutor RonLut | 2011-12-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier sind, verwenden Sie die Standard-Zeichenkodierung für Ihr system:
Statt, die Kodierung angeben, die explizit in den Konstruktor-Aufruf für
OutputStreamWriter
:(Sie brauchen nicht die
BufferedWriter
hier - es wird nicht tun Sie etwas gutes.)EDIT: Okay, du bist jetzt immer ein problem, weil Sie die Einstellung der content-length falsch. Sie sollten konvertieren von text zu binären einmal, wie diese:
java.io.IOException: too many bytes written
Richtig, das ist, weil Sie die Länge der Zeichenfolge in Zeichen als die Länge, anstatt die Länge der kodierten Zeichenfolge in bytes. Wird Bearbeiten.
NVM, hast es von mir eine minute, bevor du gepostet hast. Geändert:
conn.setChunkedStreamingMode(0);
und jetzt funktioniert es. Vielen Dank nochmal 🙂Sie können das tun, aber Sie müssen nicht. Siehe mein edit.
1. Sollte keine Ausgabe-stream gepuffert werden? 2. Du meinst schreiben sollte im finally-block? warum?
InformationsquelleAutor Jon Skeet