Додавання заголовка для HttpURLConnection


253

Я намагаюся додати заголовок для мого запиту, HttpUrlConnectionале метод, setRequestProperty()здається, не працює. Сторона сервера не отримує жодного запиту з моїм заголовком.

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

Для мене працює, як ви скажете, що заголовок було надіслано та не отримано?
Томаш Нуркевич

1
Вибачте, якщо це звучить нерозумно, але куди ви connect()дзвоните в URLConnection?
Вікдор

Я не впевнений, чи це має ефект, але ви можете спробувати додати connection.setRequestMethod("GET");(або POST або що завгодно)?
noobed

1
Ви ініціалізуєте authorizationв порожній рядок. Якщо будь-який usernameабо passwordнульовий, то authorizationце буде порожній рядок, а не нульовий. Тому фінал ifбуде виконано, але "Authorization", як мені здається, властивість буде порожньою.
zerzevul

Відповіді:


422

У минулому я використовував наступний код, і він працював з базовою автентифікацією, включеною в 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);

Ви можете спробувати наведений вище код. Код, наведений вище, призначений для POST, і ви можете змінити його для GET


15
Невелике доповнення для розробників Android (на API> = 8 aka 2.2): android.util.Base64.encode (userCredentials.getBytes (), Base64.DEFAULT); Base64.DEFAULT каже використовувати RFC2045 для кодування base64.
Денис Гладкий

@ Деніс, скажіть, будь ласка, чому слід використовувати заголовки. Мені потрібно перевірити деякі облікові дані з Android. Я використовую php на xammp. як мені це зробити? як я не знаю, як написати PHP-код із заголовками
Pankaj Nimgade

11
Звідки взялася змінна postDataу вашому прикладі?
GlenPeterson

22
Чому їх називають "RequestProperty", коли всі називають їх заголовками ??
Філіп Рего

2
Одне доповнення для версії Java8: Клас Base64 трохи змінений. Розшифровку слід робити, використовуючи:String basicAuth = "Basic " + java.util.Base64.getEncoder().encodeToString(userCredentials.getBytes());
Михайло Ступар

17

Тільки тому, що я не бачу цього фрагмента інформації у відповідях вище, тому що початково опублікований фрагмент коду не працює належним чином - це те, що encodedBytesзмінна - це значення, byte[]а не Stringзначення. Якщо ви передасте значення byte[]a new String()як нижче, фрагмент коду справно працює.

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

11

Якщо ви використовуєте Java 8, використовуйте наведений нижче код.

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

Нарешті це працювало для мене

private String buildBasicAuthorizationString(String username, String password) {

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

2
@ d3dave. Рядок створений з байтового масиву і об'єднаний з "Basic". Проблема в коді OP полягала в тому, що він об'єднав "Basic" з байтом [] і посилає його як заголовок.
Юрін

5

Ваш код нормальний. Ви також можете використовувати те ж саме.

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

Його код відповіді 200 повернення, якщо авторизація успішна


1

З RestAssurd ви також можете зробити наступне:

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
Ви не проти відформатувати код тут трохи більш чисто? Також, що given()має бути?
Натаніель Форд

Привіт, Це базове використання для відпочинку Ассурд (тестування відпочинку Api). Я додав пояснення до коду.
Еял Соліман

-1

Крок 1: Отримайте об’єкт HttpURLConnection

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

Крок 2: Додайте заголовки до HttpURLConnection методом 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));
}

Посилання на посилання

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.