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
Android開発者向けの少しの追加(API> = 8、つまり2.2):android.util.Base64.encode(userCredentials.getBytes()、Base64.DEFAULT); Base64.DEFAULTは、base64エンコードにRFC2045を使用するように指示します。
Denis Gladkiy 2013

@Denis、ヘッダーを使用する理由を教えてください。私はxammpでphpを使用しているAndroidからいくつかの資格情報を検証する必要があります。どうすればいいの?私は、ヘッダーとPHPのコードを作成する方法がわからないよう
パンカジNimgade

11
postDataあなたの例では変数はどこから来ましたか?
GlenPeterson 2016年

22
誰もがヘッダーと呼んでいるのに、なぜ「RequestProperty」と呼ばれるのですか?
フィリップレゴ2017年

2
Java8バージョンの追加:Base64クラスが少し変更されました。使用して行われるべきデコーディング:String basicAuth = "Basic " + java.util.Base64.getEncoder().encodeToString(userCredentials.getBytes());
Mihailo Stupar

17

上記の回答にこの情報が表示されないのは、最初に投稿されたコードスニペットが正しく機能しないのは、encodedBytes変数がでbyte[]あり、String値ではないためです。あなたは合格した場合byte[]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 2015年

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()想定されていますか?
ナサニエルフォード

こんにちは、これはrest-Assurd(rest APIのテスト)の基本的な使用法です。コードに説明を追加しました。
Eyal Sooliman、2017

-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.