Menambahkan header untuk HttpURLConnection

254

Saya mencoba menambahkan header untuk permintaan saya menggunakan HttpUrlConnectiontetapi metode setRequestProperty()ini tampaknya tidak berfungsi. Sisi server tidak menerima permintaan apa pun dengan tajuk saya.

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
sumber
Bekerja untuk saya, bagaimana Anda tahu bahwa tajuk telah dikirim dan tidak diterima?
Tomasz Nurkiewicz
1
maaf jika ini terdengar bodoh, tetapi di mana Anda memanggil connect()URLConnection?
Vikdor
Saya tidak yakin apakah ini berpengaruh tetapi Anda dapat mencoba menambahkan connection.setRequestMethod("GET");(atau POST atau apa pun yang Anda inginkan)?
noobed
1
Anda menginisialisasi authorizationke string kosong. Jika salah usernameatau passwordnol, maka authorizationakan menjadi string kosong, bukan nol. Oleh karena itu, final ifakan dieksekusi, tetapi "Authorization"propertinya akan kosong, menurut saya.
zerzevul

Jawaban:

422

Saya telah menggunakan kode berikut di masa lalu dan itu berhasil dengan otentikasi dasar yang diaktifkan di 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);

Anda dapat mencoba kode di atas. Kode di atas adalah untuk POST, dan Anda dapat memodifikasinya untuk GET

Cyril Beschi
sumber
15
Sedikit tambahan untuk pengembang android (di API> = 8 alias 2.2): android.util.Base64.encode (userCredentials.getBytes (), Base64.DEFAULT); Base64.DEFAULT memberitahu untuk menggunakan RFC2045 untuk pengkodean base64.
Denis Gladkiy
@Denis, tolong beri tahu saya mengapa orang harus menggunakan header. Saya harus memvalidasi beberapa kredensial dari android Saya menggunakan php di xammp. bagaimana saya harus melakukannya? karena saya tidak tahu bagaimana menulis kode php dengan header
Pankaj Nimgade
11
Dari mana variabel itu postDataberasal dalam contoh Anda?
GlenPeterson
22
Mengapa mereka disebut "RequestProperty" ketika semua orang memanggil mereka Header ??
Philip Rego
2
Satu tambahan untuk versi Java8: kelas Base64 sedikit berubah. Decoding harus dilakukan menggunakan:String basicAuth = "Basic " + java.util.Base64.getEncoder().encodeToString(userCredentials.getBytes());
Mihailo Stupar
17

Hanya karena saya tidak melihat sedikit informasi ini di jawaban di atas, alasan cuplikan kode yang semula diposting tidak berfungsi dengan benar adalah karena encodedBytesvariabelnya adalah a byte[]dan bukan Stringnilai. Jika Anda meneruskan byte[]ke a new String()seperti di bawah ini, cuplikan kode berfungsi dengan baik.

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

Jika Anda menggunakan Java 8, gunakan kode di bawah ini.

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
sumber
6

Akhirnya ini berhasil bagi saya

private String buildBasicAuthorizationString(String username, String password) {

    String credentials = username + ":" + password;
    return "Basic " + new String(Base64.encode(credentials.getBytes(), Base64.DEFAULT));
}
gori
sumber
2
@d3dave. String dibuat dari byte array dan disatukan dengan "Basic". Masalah dalam kode OP adalah bahwa ia menggabungkan "Basic" dengan byte [] dan mengirimkannya sebagai header.
yurin
5

Kode Anda baik-baik saja. Anda juga dapat menggunakan hal yang sama dengan cara ini.

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

Pengembalian kode respon 200 jika otorisasi berhasil

pintu
sumber
1

Dengan RestAssurd Anda juga dapat melakukan hal berikut:

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
sumber
1
Apakah Anda keberatan memformat kode di sini sedikit lebih bersih? Juga, apa yang given()seharusnya?
Nathaniel Ford
Hai, Ini adalah penggunaan dasar untuk rest-Assurd (menguji sisanya Api). Saya menambahkan menjelaskan ke kode.
Eyal Sooliman
-1

Langkah 1: Dapatkan objek HttpURLConnection

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

Langkah 2: Tambahkan header ke HttpURLConnection menggunakan metode 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));
}

Tautan referensi

Hari Krishna
sumber