Aggiunta dell'intestazione per HttpURLConnection


254

Sto cercando di aggiungere l'intestazione per la mia richiesta utilizzando HttpUrlConnectionma il metodo setRequestProperty()non sembra funzionare. Il lato server non riceve alcuna richiesta con la mia intestazione.

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);
        }

Funziona per me, come fai a dire che l'intestazione è stata inviata e non ricevuta?
Tomasz Nurkiewicz,

1
scusate se sembra stupido, ma dove state chiamando connect()URLConnection?
Vikdor,

Non sono sicuro che questo abbia un effetto, ma puoi provare ad aggiungere connection.setRequestMethod("GET");(o POST o quello che vuoi)?
Noobed

1
Si inizializza authorizationsulla stringa vuota. Se uno usernameo passwordè nullo, allora authorizationsarà la stringa vuota, non nulla. Pertanto, il finale ifverrà eseguito, ma la "Authorization"proprietà verrà impostata su vuota, mi sembra.
zerzevul,

Risposte:


422

Ho usato il seguente codice in passato e aveva funzionato con l'autenticazione di base abilitata in TomCat:

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);

Puoi provare il codice sopra. Il codice sopra è per POST e puoi modificarlo per GET


15
Una piccola aggiunta per gli sviluppatori Android (su API> = 8 aka 2.2): android.util.Base64.encode (userCredentials.getBytes (), Base64.DEFAULT); Base64.DEFAULT dice di usare RFC2045 per la codifica base64.
Denis Gladkiy,

@Denis, per favore, dimmi perché dovresti usare le intestazioni. Devo convalidare alcune credenziali da Android Sto usando php su xammp. come dovrei andare per questo. dato che non so come scrivere il codice php con le intestazioni
Pankaj Nimgade,

11
Da dove viene la variabile postDatanel tuo esempio?
GlenPeterson,

22
Perché vengono chiamati "RequestProperty" quando tutti li chiamano Headers ??
Philip Rego,

2
Un'aggiunta per la versione Java8: la classe Base64 è leggermente cambiata. La decodifica dovrebbe essere fatta usando:String basicAuth = "Basic " + java.util.Base64.getEncoder().encodeToString(userCredentials.getBytes());
Mihailo Stupar il

17

Solo perché non vedo questo bit di informazioni nelle risposte sopra, il motivo per cui lo snippet di codice originariamente pubblicato non funziona correttamente è perché la encodedBytesvariabile è byte[]un Stringvalore e non un valore. Se passi byte[]a a new String()come di seguito, lo snippet di codice funziona perfettamente.

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

11

Se si utilizza Java 8, utilizzare il codice seguente.

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

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

6

Finalmente questo ha funzionato per me

private String buildBasicAuthorizationString(String username, String password) {

    String credentials = username + ":" + password;
    return "Basic " + new String(Base64.encode(credentials.getBytes(), Base64.DEFAULT));
}

2
@ d3dave. La stringa è stata creata dall'array di byte e concatenata con "Base". Il problema nel codice OP era che concatenava "Basic" con byte [] e lo invia come intestazione.
yurin,

5

Il tuo codice va bene. Puoi anche usare la stessa cosa in questo modo.

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;
}

Il suo codice di risposta di ritorno 200 se l'autorizzazione ha esito positivo


1

Con RestAssurd puoi anche fare quanto segue:

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

1
Ti dispiace formattare il codice qui in modo un po 'più pulito? Inoltre, cosa given()dovrebbe essere?
Nathaniel Ford,

Salve, questo è l'utilizzo base per rest-Assurd (testing rest Api). Ho aggiunto spiega al codice.
Eyal Sooliman,

-1

Passaggio 1: ottieni l'oggetto HttpURLConnection

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

Passaggio 2: aggiungere intestazioni a HttpURLConnection utilizzando il metodo setRequestProperty.

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));
}

Link di riferimento

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.