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

나를 위해, 헤더가 전송되고 수신되지 않았다는 것을 어떻게 알 수 있습니까?
Tomasz Nurkiewicz

1
바보 같이 들리면 죄송하지만 connect()URLConnection에서 어디로 전화 합니까?
Vikdor

이것이 효과가 있는지 확실하지 않지만 추가 connection.setRequestMethod("GET");(또는 POST 또는 원하는 것)를 시도 할 수 있습니까?
noobed

1
authorization빈 문자열로 초기화 합니다. username또는 passwordnull 중 하나 이면 null이 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
안드로이드 개발자를위한 약간의 추가 (API> = 8 일명 2.2) : android.util.Base64.encode (userCredentials.getBytes (), Base64.DEFAULT); Base64.DEFAULT는 base64 인코딩에 RFC2045를 사용하도록 지시합니다.
Denis Gladkiy

@Denis, 왜 헤더를 사용해야하는지 알려주십시오. xammp에서 PHP를 사용하는 안드로이드에서 일부 자격 증명을 확인해야합니다. 어떻게해야합니까? 내가 헤더의 PHP 코드를 작성하는 방법을 알고하지 않는 한
판 카즈 Nimgade에게

11
postData예제에서 변수는 어디에서 왔습니까?
GlenPeterson

22
모두가 헤더를 호출 할 때 왜 "RequestProperty"라고 불리는가?
Philip Rego 2016 년

2
Java8 버전의 한 가지 추가 사항 : Base64 클래스가 약간 변경되었습니다. 사용하여 수행 할 수 있어야 디코딩 :String basicAuth = "Basic " + java.util.Base64.getEncoder().encodeToString(userCredentials.getBytes());
Mihailo Stupar

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"을 byte []와 연결하여 헤더로 전송한다는 것입니다.
yurin

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()있어야합니까?
Nathaniel Ford

안녕하세요, 이것은 rest-Assurd (test rest rest api)의 기본 사용법입니다. 코드에 설명을 추가했습니다.
Eyal Sooliman

-1

1 단계 : HttpURLConnection 객체 가져 오기

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

2 단계 : setRequestProperty 메소드를 사용하여 HttpURLConnection에 헤더를 추가하십시오.

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

참조 링크

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.