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

254

Я пытаюсь добавить заголовок для моего запроса, 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"свойство будет установлено пустым, мне кажется.
Зерзевул

Ответы:

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 или 2.2): android.util.Base64.encode (userCredentials.getBytes (), Base64.DEFAULT); Base64.DEFAULT указывает использовать RFC2045 для кодирования base64.
Денис Гладкий
@ Денис, скажите, пожалуйста, зачем использовать заголовки? Я должен проверить некоторые учетные данные от Android Я использую PHP на XAMMP. как я должен пойти на это. поскольку я не знаю, как написать php-код с заголовками
Pankaj Nimgade
11
Откуда взялась переменная postDataв вашем примере?
ГленПетерсон
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);
Chandubabu
источник
6

Наконец-то это сработало для меня

private String buildBasicAuthorizationString(String username, String password) {

    String credentials = username + ":" + password;
    return "Basic " + new String(Base64.encode(credentials.getBytes(), Base64.NO_WRAP));
}
гори
источник
2
@ d3dave. Строка была создана из байтового массива и объединена с «Basic». Проблема в OP-коде заключалась в том, что он связал «Basic» с byte [] и отправил его в качестве заголовка.
Юрин
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, если авторизация прошла успешно

Pintu
источник
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()должно быть?
Натаниэль Форд
Привет! Это базовое использование для rest-Assurd (тестирование rest 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));
}

Ссылка ссылка

Хари Кришна
источник