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);
        }
Minh-Ha Le
la source
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

Cyril Beschi
la source
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);
Joseph Cozad
la source
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);
Chandubabu
la source
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));
}
gori
la source
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

pintu
la source
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
Eyal Sooliman
la source
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

Hari Krishna
la source