HTTP Kann man den Raw HTTPS Request irgendwie ausgeben lassen?

Thallius

Top Contributor
Hi,

wir haben eine externe Firma die für uns eine REST API zu Ihrem Produkt programmiert. Leider sind die Kollegen nicht so richtig gut drauf und ich muss ihnen jeden Bug auf dem Silbertablett servieren bevor sie sich darum kümmern.

Nun habe ich etwas extrem seltsames:

Es gibt ein Kommando zum Erstellen eines Library Entriss in deren Datenbank. Dazu sende ich einen POST Request an eine URL mit einem JSON Body der den Eintrag enthält. Funktioniert soweit gut.
Ein Eintrag sieht dabei so aus:

Code:
{
    "location":
    {
        "stackID":1285
    },
    "questions":
    [
        {
            "text":"a-b-c",
            "complianceID": "Yes"
        }
    ],
    "answer":
    {
        "text":" ",
        "footnotes":[]
    },
    "tags":
    [
        "a-b-c",
        "d-e",
        "x",
        "y"
    ],
    "languageCode":"en"
}

Wenn ich diesen Request über Postman abschicke funktioniert er einwandfrei. Sende ich den gleichen Request aus meiner App heraus mit Java, dann bekomme ich einen ErrorCode 400. Ich konnte herausfinden, dass es an dem Bindestrich in questions -> text liegt. Steht in diesem Feld ein Bindestrich gibt es einen ErrorCode 400 entferne ich den Bindestrich geht es. Wie gesagt NUR aus meiner App heraus. Mit Postman ist es kein Problem.

Ich habe den erzeugten JSON-String in meiner App kopiert und in den Postman gepackt und es geht!

Ich müßte nun also irgendwie Debuggen können was an meinem JAVA Request anders ist.
Beim Header sehe ich keinen Unterschied. Postman:

Code:
Content-Type: application/json
Authorization: Bearer xxx
User-Agent: PostmanRuntime/7.26.5
Accept: */*
Postman-Token: 4b36f457-b429-40dd-ad1b-19a1bbf504e9
Host: apiurl
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Length: 332

Mein Code zum Header erzeugen:

Code:
            con.setRequestMethod("POST");
            con.setRequestProperty("Authorization", token.type + " " + token.token);
            con.setRequestProperty("User-Agent", "PostmanRuntime/7.3.0");
            con.setRequestProperty("Accept", "*/*");
            con.setRequestProperty("Host", apiURL);
            con.setRequestProperty("Accept-Encoding", "gzip, deflate, br");
            con.setRequestProperty("Connection", "keep-alive");
            con.setRequestProperty("Content-Type", "application/json");

und der Code zum Erzeugen des Body:

Code:
            con.setDoOutput(true);
            DataOutputStream wr = new DataOutputStream(con.getOutputStream());

            wr.writeBytes(json);
            wr.flush();
            wr.close();

Wie komme ich hier also weiter?

Gruß

Thallius
 

mrBrown

Super-Moderator
Mitarbeiter
In jedem Fall ist DataOutputStream nahezu immer die falsche Wahl, reicht es vielleicht schon, den nicht zu benutzten?
 

Thallius

Top Contributor
Habe auch schon

Code:
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(con.getOutputStream(), StandardCharsets.UTF_8));
            bw.write(json);
            bw.flush();
            bw.close();

versucht. Keine Änderung
 

Thallius

Top Contributor
Ok ich korrigiere mich. Nachdem ich es jetzt nochmal probiert habe geht es mit BufferWriter. Habe in der Zwischenzeit soviel rumprobiert das ich wohl noch etwas anderes geändert haben muss
 
K

kneitzel

Gast
Evtl. eine kleine Anmerkung bezüglich "Debugging / Prüfen von http Requests und Antworten":
Ein Tool, das ich in der Vergangenheit eingesetzt habe, ist Fiddler. Das agiert als Proxy und erlaubt die Analyse und Veränderung von Requests.
Dann reicht es, dass man die App mit dem entsprechenden Proxy aufruft (also -DproxyHost und -DproxyPort).

In dem Fall wäre meine Erwartungshaltung, dass man dann die "Protokoll Bytes" des DataOutputStreams gut hätte sehen können ...
 

Thallius

Top Contributor
Evtl. eine kleine Anmerkung bezüglich "Debugging / Prüfen von http Requests und Antworten":
Ein Tool, das ich in der Vergangenheit eingesetzt habe, ist Fiddler. Das agiert als Proxy und erlaubt die Analyse und Veränderung von Requests.
Dann reicht es, dass man die App mit dem entsprechenden Proxy aufruft (also -DproxyHost und -DproxyPort).

In dem Fall wäre meine Erwartungshaltung, dass man dann die "Protokoll Bytes" des DataOutputStreams gut hätte sehen können ...

danke das halte ich mal im Hinterkopf für das nächste Problem
 

mihe7

Top Contributor
Mit Bordmitteln kann man das Plattform-Logging verwenden. Um beispielsweise HttpURLConnection zu loggen muss man den Loglevel von sun.net.www.protocol.http.HttpURLConnection einstellen (man kann auch global das Loglevel des Root-Loggers ändern):

Java:
import java.net.*;
import java.util.*;
import java.util.logging.*;

public class Test {
    static void performRequest() throws Exception {
        HttpURLConnection con = (HttpURLConnection) 
                new URL("https://www.wikipedia.de").openConnection();
        con.setRequestProperty("User-Agent", "PostmanRuntime/7.3.0");
        System.out.println(con.getResponseCode());
    }

    public static void main(String[] args) throws Exception {
        performRequest();

        ConsoleHandler handler = new ConsoleHandler();
        handler.setLevel(Level.ALL);
        Logger log = LogManager.getLogManager().getLogger("sun.net.www.protocol.http.HttpURLConnection");
        log.addHandler(handler);
        log.setLevel(Level.FINE);

        performRequest();
    }
}

liefert etwa:
Code:
200
Sep 28, 2020 2:52:20 PM sun.net.www.protocol.http.HttpURLConnection writeRequests
FEIN: sun.net.www.MessageHeader@a484745 pairs: {GET / HTTP/1.1: null}{User-Agent: PostmanRuntime/7.3.0}{Host: www.wikipedia.de}{Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2}{Connection: keep-alive}
Sep 28, 2020 2:52:20 PM sun.net.www.protocol.http.HttpURLConnection getInputStream0
FEIN: sun.net.www.MessageHeader@1e8b4066 pairs: {null: HTTP/1.1 200 OK}{Server: nginx/1.6.2}{Date: Mon, 28 Sep 2020 12:52:20 GMT}{Content-Type: text/html; charset=UTF-8}{Transfer-Encoding: chunked}{Connection: keep-alive}
200

Für SSL-Debugging kann man die System-Property -Djavax.net.debug=all setzen. Das produziert sehr viel Output.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A HTTPS-Request via Proxy mit Konfigurationsskript Netzwerkprogrammierung 3
FrankenDerStein HTTP Https Server Bibliothek für Linux und Android gesucht. Netzwerkprogrammierung 7
JaXnPriVate Java HTTPS Server (Secure Sockets) Netzwerkprogrammierung 15
G localhost im Backend https vs. http Netzwerkprogrammierung 9
T HTTPS-Requests an Server: POST-Parameter kommen nicht an Netzwerkprogrammierung 5
M HTTPS Login & etwas posten Netzwerkprogrammierung 0
M Proxy und HTTPS Netzwerkprogrammierung 3
Thallius HTTP HTTPS unter Java 1.6 schlägt fehl Netzwerkprogrammierung 4
agent47 HTTPs Server Netzwerkprogrammierung 5
GENiALi Grizzly mit HTTPS Netzwerkprogrammierung 0
N Hintergrundlogin HTTPs Webform Netzwerkprogrammierung 5
E Gruppenchat: Über HTTPS oder nicht? Netzwerkprogrammierung 5
K HTTPS Zertifikat Netzwerkprogrammierung 3
F C/S über HTTPS Netzwerkprogrammierung 2
NoXiD Java mit HTTPS verbinden Netzwerkprogrammierung 6
T Up- und Download mit https Netzwerkprogrammierung 14
M HTTP HTTPS-Verbindung mittels Java und Javascript Netzwerkprogrammierung 2
T HTTPS einloggen Netzwerkprogrammierung 9
L Https Verbindung wird aus jar heraus nicht aufgebaut Netzwerkprogrammierung 12
E HTTPS Debuggen (verschlüsselte Daten anzeigen)? Netzwerkprogrammierung 12
Q HTTPS mit Apache HttpClient Netzwerkprogrammierung 4
M HTTPS Seiten runterladen Netzwerkprogrammierung 2
C HTTPS mit Apache HTTPClient Netzwerkprogrammierung 1
P HTTPS - öffentliches Zertifikat - ermitteln Netzwerkprogrammierung 5
G file download über https mit p12 Zertifikat Netzwerkprogrammierung 4
O HTTP Wer hilft mit meinem UTF-8 http Request ? Netzwerkprogrammierung 1
J API Aufruf mit GET Request und HMAC Netzwerkprogrammierung 3
M HTTP PATCH Request mit Java ausführen Netzwerkprogrammierung 2
N Post u Head Request an Server Netzwerkprogrammierung 4
M http request and response Netzwerkprogrammierung 0
J Json von Html request einlesen Netzwerkprogrammierung 0
T curl request in java umwandeln Netzwerkprogrammierung 4
S PUT-Request Netzwerkprogrammierung 0
P Java Deauth / Deauthentication request Netzwerkprogrammierung 10
C Android: Json-POST Request zu REST Webservice Netzwerkprogrammierung 2
R Seltsames Verhalten bei GET Request Netzwerkprogrammierung 7
Y HTTP No request data found Netzwerkprogrammierung 2
B Socket HTTP-Request führt zu Endlosschleife Netzwerkprogrammierung 5
B Post Request in Java Netzwerkprogrammierung 11
D OT JavaScript JQuery AJAX Request Netzwerkprogrammierung 2
R HTTP Apache HTTP Client: Request mit angehängter Datei Netzwerkprogrammierung 2
O Http request Netzwerkprogrammierung 7
T HTTP POST Request Netzwerkprogrammierung 3
E HTTP Request? Netzwerkprogrammierung 4
L Body eines http Request auslesen Netzwerkprogrammierung 2
K Ende eines HTTP Response/Request Netzwerkprogrammierung 6
D http request Netzwerkprogrammierung 11
ARadauer POST Request absetzen.. Netzwerkprogrammierung 3
J GET Request Netzwerkprogrammierung 1
hdi POST Request (HttpConnection) Netzwerkprogrammierung 6
G HTTP-Request InputStream-Problem Netzwerkprogrammierung 5
J 403 error bei POST request Netzwerkprogrammierung 3
G auf http-request antworten. Netzwerkprogrammierung 3
G JMS Objektzugriff Request Reply erzeugt lediglich Kopie Netzwerkprogrammierung 4
L Java HTTP Request Netzwerkprogrammierung 3
S HTTP Request erstellen Netzwerkprogrammierung 2
K Bad Request nach Form Login in Jakarta HttpClient Netzwerkprogrammierung 4
B lange Strings in http-Request? Netzwerkprogrammierung 3
M erst POST dann Http-Request über URLConnection Netzwerkprogrammierung 3
m@nu Ende von Stream bei HTTP-Request Netzwerkprogrammierung 3
D HTTP Request erstellen (Form Name übergeben!) Netzwerkprogrammierung 3
P Easy Http Request Netzwerkprogrammierung 9
J HTTP-POST-Request mit Anhang über Socket Netzwerkprogrammierung 2
Z HTTP Request Netzwerkprogrammierung 3
A http request per socket an apache server Netzwerkprogrammierung 5
M Ein HTTP-request aus Java heraus senden Netzwerkprogrammierung 3
J HTTP Request Netzwerkprogrammierung 2
B Laden einer *.csv Datei von einem Webserver (http-request) Netzwerkprogrammierung 8
C dhcp request Netzwerkprogrammierung 16
D Bad Request bei Dateiload Netzwerkprogrammierung 2
X mehrere Request über eine HttpURLConnection Netzwerkprogrammierung 2
G Http Request Netzwerkprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben