Adding header for HttpURLConnection

2019-01-01 08:02发布

问题:

I\'m trying to add header for my request using HttpUrlConnection but the method setRequestProperty() doesn\'t seem working. The server side doesn\'t receive any request with my header.

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:

I have used the following code in the past and it had worked with basic authentication enabled in 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);

You can try the above code. The code above is for POST, and you can modify it for GET



回答2:

Just cause I don\'t see this bit of information in the answers above, the reason the code snippet originally posted doesn\'t work correctly is because the encodedBytes variable is a byte[] and not a String value. If you pass the byte[] to a new String() as below, the code snippet works perfectly.

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


回答3:

If you are using Java 8, use the code below.

URLConnection connection = url.openConnection();
HttpURLConnection httpConn = (HttpURLConnection) connection;

String basicAuth = Base64.getEncoder().encodeToString((username+\":\"+password).getBytes(StandardCharsets.UTF_8));
httpConn.setRequestProperty (\"Authorization\", \"Basic \"+basicAuth);


回答4:

Your code is fine.You can also use the same thing in this way.

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

Its Return response code 200 if authorizationis success



回答5:

Finally this worked for me

private String buildBasicAuthorizationString(String username, String password) {

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


回答6:

With RestAssurd you can also do the following:

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


标签: java http