Hinzufügen eines Headers für HttpURLConnection

253

Ich versuche, einen Header für meine Anfrage hinzuzufügen, HttpUrlConnectionaber die Methode setRequestProperty()scheint nicht zu funktionieren. Die Serverseite erhält keine Anfrage mit meinem Header.

HttpURLConnection hc;
    try {
        String authorization = "";
        URL address = new URL(url);
        hc = (HttpURLConnection) address.openConnection();


        hc.setDoOutput(true);
        hc.setDoInput(true);
        hc.setUseCaches(false);

        if (username != null && password != null) {
            authorization = username + ":" + password;
        }

        if (authorization != null) {
            byte[] encodedBytes;
            encodedBytes = Base64.encode(authorization.getBytes(), 0);
            authorization = "Basic " + encodedBytes;
            hc.setRequestProperty("Authorization", authorization);
        }
Minh-Ha Le
quelle
Funktioniert für mich, wie können Sie feststellen, dass der Header gesendet und nicht empfangen wurde?
Tomasz Nurkiewicz
1
Entschuldigung, wenn das dumm klingt, aber wo connect()rufst du die URLConnection an?
Vikdor
Ich bin nicht sicher, ob dies einen Effekt hat, aber Sie können versuchen, etwas hinzuzufügen connection.setRequestMethod("GET");(oder POST oder was auch immer Sie wollen)?
Noobed
1
Sie initialisieren authorizationdie leere Zeichenfolge. Wenn entweder usernameoder passwordnull ist, authorizationist die leere Zeichenfolge nicht null. Daher wird das Finale ifausgeführt, aber die "Authorization"Eigenschaft wird auf leer gesetzt, scheint mir.
Zerzevul

Antworten:

422

Ich habe in der Vergangenheit den folgenden Code verwendet und er hat mit der in TomCat aktivierten Basisauthentifizierung funktioniert:

URL myURL = new URL(serviceURL);
HttpURLConnection myURLConnection = (HttpURLConnection)myURL.openConnection();

String userCredentials = "username:password";
String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userCredentials.getBytes()));

myURLConnection.setRequestProperty ("Authorization", basicAuth);
myURLConnection.setRequestMethod("POST");
myURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
myURLConnection.setRequestProperty("Content-Length", "" + postData.getBytes().length);
myURLConnection.setRequestProperty("Content-Language", "en-US");
myURLConnection.setUseCaches(false);
myURLConnection.setDoInput(true);
myURLConnection.setDoOutput(true);

Sie können den obigen Code ausprobieren. Der obige Code gilt für POST und kann für GET geändert werden

Cyril Beschi
quelle
15
Eine kleine Ergänzung für Android-Entwickler (auf API> = 8 aka 2.2): android.util.Base64.encode (userCredentials.getBytes (), Base64.DEFAULT); Base64.DEFAULT weist an, RFC2045 für die Base64-Codierung zu verwenden.
Denis Gladkiy
@Denis, würdest du mir bitte sagen, warum man Header verwenden sollte. Ich muss einige Anmeldeinformationen von Android validieren. Ich verwende PHP auf Xammp. Wie soll ich das machen? da ich nicht weiß, wie man PHP-Code mit Headern schreibt
Pankaj Nimgade
11
Woher kommt die Variable postDatain Ihrem Beispiel?
GlenPeterson
22
Warum heißen sie "RequestProperty", wenn jeder sie Header nennt?
Philip Rego
2
Ein Zusatz für die Java8-Version: Die Base64-Klasse wurde ein wenig geändert. Die Dekodierung sollte erfolgen mit:String basicAuth = "Basic " + java.util.Base64.getEncoder().encodeToString(userCredentials.getBytes());
Mihailo Stupar
17

Nur weil ich diese Informationen in den obigen Antworten nicht sehe, funktioniert der ursprünglich veröffentlichte Codefragment nicht richtig, weil die encodedBytesVariable ein byte[]und kein StringWert ist. Wenn Sie das byte[]an a new String()wie unten übergeben, funktioniert das Code-Snippet einwandfrei.

encodedBytes = Base64.encode(authorization.getBytes(), 0);
authorization = "Basic " + new String(encodedBytes);
Joseph Cozad
quelle
11

Wenn Sie Java 8 verwenden, verwenden Sie den folgenden Code.

URLConnection connection = url.openConnection();
HttpURLConnection httpConn = (HttpURLConnection) connection;

String basicAuth = Base64.getEncoder().encodeToString((username+":"+password).getBytes(StandardCharsets.UTF_8));
httpConn.setRequestProperty ("Authorization", "Basic "+basicAuth);
Chandubabu
quelle
6

Endlich hat das bei mir geklappt

private String buildBasicAuthorizationString(String username, String password) {

    String credentials = username + ":" + password;
    return "Basic " + new String(Base64.encode(credentials.getBytes(), Base64.DEFAULT));
}
gori
quelle
2
@ d3dave. Die Zeichenfolge wurde aus einem Byte-Array erstellt und mit "Basic" verkettet. Das Problem im OP-Code war, dass er "Basic" mit Byte [] verkettete und als Header sendete.
Yurin
5

Ihr Code ist in Ordnung. Auf diese Weise können Sie dasselbe auch verwenden.

public static String getResponseFromJsonURL(String url) {
    String jsonResponse = null;
    if (CommonUtility.isNotEmpty(url)) {
        try {
            /************** For getting response from HTTP URL start ***************/
            URL object = new URL(url);

            HttpURLConnection connection = (HttpURLConnection) object
                    .openConnection();
            // int timeOut = connection.getReadTimeout();
            connection.setReadTimeout(60 * 1000);
            connection.setConnectTimeout(60 * 1000);
            String authorization="xyz:xyz$123";
            String encodedAuth="Basic "+Base64.encode(authorization.getBytes());
            connection.setRequestProperty("Authorization", encodedAuth);
            int responseCode = connection.getResponseCode();
            //String responseMsg = connection.getResponseMessage();

            if (responseCode == 200) {
                InputStream inputStr = connection.getInputStream();
                String encoding = connection.getContentEncoding() == null ? "UTF-8"
                        : connection.getContentEncoding();
                jsonResponse = IOUtils.toString(inputStr, encoding);
                /************** For getting response from HTTP URL end ***************/

            }
        } catch (Exception e) {
            e.printStackTrace();

        }
    }
    return jsonResponse;
}

Sein Rückgabeantwortcode 200, wenn die Autorisierung erfolgreich ist

Pintu
quelle
1

Mit RestAssurd können Sie auch Folgendes tun:

String path = baseApiUrl; //This is the base url of the API tested
    URL url = new URL(path);
    given(). //Rest Assured syntax 
            contentType("application/json"). //API content type
            given().header("headerName", "headerValue"). //Some API contains headers to run with the API 
            when().
            get(url).
            then().
            statusCode(200); //Assert that the response is 200 - OK
Eyal Sooliman
quelle
1
Haben Sie etwas dagegen, den Code hier etwas sauberer zu formatieren? Auch was given()soll sein?
Nathaniel Ford
Hallo, Dies ist die Basisverwendung für rest-Assurd (Testen der Rest-API). Ich habe Erklärungen zum Code hinzugefügt.
Eyal Sooliman
-1

Schritt 1: HttpURLConnection-Objekt abrufen

URL url = new URL(urlToConnect);
HttpURLConnection httpUrlConnection = (HttpURLConnection) url.openConnection();

Schritt 2: Fügen Sie der HttpURLConnection mithilfe der setRequestProperty-Methode Header hinzu.

Map<String, String> headers = new HashMap<>();

headers.put("X-CSRF-Token", "fetch");
headers.put("content-type", "application/json");

for (String headerKey : headers.keySet()) {
    httpUrlConnection.setRequestProperty(headerKey, headers.get(headerKey));
}

Referenz - Link

Hari Krishna
quelle