Thêm tiêu đề cho kết nối httpURLC


253

Tôi đang cố gắng thêm tiêu đề cho yêu cầu của mình bằng cách sử dụng HttpUrlConnectionnhưng phương thức setRequestProperty()này dường như không hoạt động. Phía máy chủ không nhận được bất kỳ yêu cầu nào với tiêu đề của tôi.

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

Làm việc cho tôi, làm thế nào để bạn biết tiêu đề đã được gửi và không nhận được?
Tomasz Nurkiewicz

1
xin lỗi nếu điều này nghe có vẻ ngu ngốc, nhưng bạn đang gọi connect()URLConnection ở đâu?
Vikdor

Tôi không chắc chắn nếu điều này có ảnh hưởng nhưng bạn có thể thử thêm connection.setRequestMethod("GET");(hoặc POST hoặc bất cứ điều gì bạn muốn) không?
noo

1
Bạn khởi tạo authorizationchuỗi rỗng. Nếu một trong hai usernamehoặc passwordlà null, thì đó authorizationsẽ là chuỗi rỗng, không phải null. Do đó, trận chung kết ifsẽ được thực thi, nhưng "Authorization"tài sản sẽ được đặt thành trống, đối với tôi.
zerzevul

Câu trả lời:


422

Tôi đã sử dụng mã sau đây và nó đã hoạt động với xác thực cơ bản được bật trong 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);

Bạn có thể thử đoạn mã trên. Mã ở trên là cho POST và bạn có thể sửa đổi nó cho GET


15
Một bổ sung nhỏ cho các nhà phát triển Android (trên API> = 8 aka 2.2): android.util.Base64.encode (userCredentials.getBytes (), Base64.DEFAULT); Base64.DEFAULT bảo sử dụng RFC2045 để mã hóa base64.
Denis Gladkiy

@Denis, bạn vui lòng cho tôi biết tại sao nên sử dụng tiêu đề. Tôi phải xác thực một số thông tin đăng nhập từ Android Tôi đang sử dụng php trên xammp. Làm thế nào tôi nên đi cho nó. vì tôi không biết cách viết mã php với các tiêu đề
Pankaj Nimgade 17/2/2015

11
Biến đã postDatađến từ đâu trong ví dụ của bạn?
GlenPeterson

22
Tại sao họ được gọi là "RequestProperty" khi mọi người gọi họ là Tiêu đề ??
Philip Rego

2
Một bổ sung cho phiên bản Java8: Lớp Base64 có một chút thay đổi. Giải mã nên được thực hiện bằng cách sử dụng:String basicAuth = "Basic " + java.util.Base64.getEncoder().encodeToString(userCredentials.getBytes());
Mihailo Stupar

17

Chỉ cần tôi không thấy một chút thông tin trong các câu trả lời ở trên, lý do đoạn mã được đăng ban đầu không hoạt động chính xác là vì encodedBytesbiến là một byte[]và không phải là một Stringgiá trị. Nếu bạn chuyển byte[]đến một new String()như dưới đây, đoạn mã hoạt động hoàn hảo.

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

11

Nếu bạn đang sử dụng Java 8, hãy sử dụng mã dưới đây.

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

Cuối cùng, điều này đã làm việc cho tôi

private String buildBasicAuthorizationString(String username, String password) {

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

2
@ d3dave. Chuỗi được tạo từ mảng byte và được nối với "Cơ bản". Vấn đề trong mã OP là ông đã ghép "Cơ bản" với byte [] và gửi nó dưới dạng tiêu đề.
yurin

5

Mã của bạn vẫn ổn. Bạn cũng có thể sử dụng điều tương tự theo cách này.

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

Mã phản hồi trả về 200 nếu ủy quyền thành công


1

Với RestAssurd bạn cũng có thể làm như sau:

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
Bạn có nhớ định dạng mã ở đây sạch sẽ hơn một chút không? Ngoài ra, những gì được given()cho là?
Nathaniel Ford

Xin chào, Đây là cách sử dụng cơ bản cho rest-Assurd (thử nghiệm Api còn lại). Tôi đã thêm giải thích cho mã.
Eyal Sooliman

-1

Bước 1: Nhận đối tượng kết nối httpURLC

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

Bước 2: Thêm các tiêu đề vào httpURLConnection bằng phương thức 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));
}

Liên kết tham khảo

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.