Ajout d'un en-tête pour HttpURLConnection


254

J'essaie d'ajouter un en-tête pour ma demande en utilisant HttpUrlConnectionmais la méthode setRequestProperty()ne semble pas fonctionner. Le côté serveur ne reçoit aucune demande avec mon en-tête.

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

Fonctionne pour moi, comment dites-vous que l'en-tête a été envoyé et non reçu?
Tomasz Nurkiewicz

1
désolé si cela semble stupide, mais où appelez-vous connect()sur URLConnection?
Vikdor

Je ne sais pas si cela a un effet mais vous pouvez essayer d'ajouter connection.setRequestMethod("GET");(ou POST ou tout ce que vous voulez)?
2012

1
Vous initialisez authorizationà la chaîne vide. Si l'un usernameou l' autre passwordest nul, alors authorizationsera la chaîne vide, pas null. Par conséquent, la finale ifsera exécutée, mais la "Authorization"propriété sera définie sur vide, me semble-t-il.
zerzevul

Réponses:


422

J'ai utilisé le code suivant dans le passé et il avait fonctionné avec l'authentification de base activée dans 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);

Vous pouvez essayer le code ci-dessus. Le code ci-dessus est pour POST, et vous pouvez le modifier pour GET


15
Un petit ajout pour les développeurs Android (sur API> = 8 aka 2.2): android.util.Base64.encode (userCredentials.getBytes (), Base64.DEFAULT); Base64.DEFAULT indique d'utiliser RFC2045 pour le codage base64.
Denis Gladkiy

@Denis, pourriez-vous me dire pourquoi utiliser des en-têtes. Je dois valider certaines informations d'identification d'Android J'utilise php sur xammp. comment dois-je y aller. comme je ne sais pas comment écrire du code php avec des en
Pankaj Nimgade

11
D'où vient la variable postDatadans votre exemple?
GlenPeterson

22
Pourquoi sont-ils appelés "RequestProperty" alors que tout le monde les appelle en-têtes ??
Philip Rego

2
Un ajout pour la version Java8: la classe Base64 est un peu modifiée. Le décodage doit être fait en utilisant:String basicAuth = "Basic " + java.util.Base64.getEncoder().encodeToString(userCredentials.getBytes());
Mihailo Stupar

17

Juste parce que je ne vois pas ce morceau d'informations dans les réponses ci-dessus, la raison pour laquelle l'extrait de code initialement publié ne fonctionne pas correctement est parce que la encodedBytesvariable est une byte[]et non une Stringvaleur. Si vous passez le byte[]à a new String()comme ci-dessous, l'extrait de code fonctionne parfaitement.

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

11

Si vous utilisez Java 8, utilisez le code ci-dessous.

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

Enfin, cela a fonctionné pour moi

private String buildBasicAuthorizationString(String username, String password) {

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

2
@ d3dave. La chaîne a été créée à partir d'un tableau d'octets et concaténée avec "Basic". Le problème dans le code OP était qu'il a concaténé "Basic" avec l'octet [] et l'a envoyé comme en-tête.
yurin

5

Votre code est correct. Vous pouvez également utiliser la même chose de cette façon.

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

Son code de réponse de retour 200 si l'autorisation est réussie


1

Avec RestAssurd, vous pouvez également effectuer les opérations suivantes:

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
Cela vous dérange de formater le code ici un peu plus proprement? Et qu'est-ce que c'est given()censé être?
Nathaniel Ford

Salut, Ceci est l'utilisation de base pour rest-Assurd (test de repos Api). J'ai ajouté des explications au code.
Eyal Sooliman

-1

Étape 1: obtenir l'objet HttpURLConnection

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

Étape 2: ajoutez des en-têtes à HttpURLConnection à l'aide de la méthode 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));
}

Lien de référence

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.