HttpURLConnection के लिए हेडर जोड़ना


254

मैं अपने अनुरोध का उपयोग करके हेडर जोड़ने की कोशिश कर रहा हूं, 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);
        }

मेरे लिए काम करता है, आप कैसे कहते हैं कि हेडर भेजा गया था और प्राप्त नहीं हुआ था?
टॉमाज़ नर्कविक्ज़

1
क्षमा करें यदि यह गूंगा लगता है, लेकिन आप connect()URLConnection पर कहां कॉल कर रहे हैं ?
विकोडोर

मुझे यकीन नहीं है कि इसका प्रभाव पड़ता है लेकिन आप जोड़ने की कोशिश कर सकते हैं connection.setRequestMethod("GET");(या POST या जो आप चाहते हैं)?
नोबेड

1
आप authorizationखाली स्ट्रिंग को इनिशियलाइज़ करते हैं। यदि दोनों में से usernameया passwordरिक्त है, तो authorizationखाली स्ट्रिंग, नहीं अशक्त हो जाएगा। इसलिए, फाइनल ifनिष्पादित हो जाएगा, लेकिन "Authorization"संपत्ति खाली करने के लिए सेट हो जाएगी, मुझे लगता है।
zerzevul

जवाबों:


422

मैंने पूर्व में निम्नलिखित कोड का उपयोग किया है और इसने बेसिक प्रमाणीकरण के साथ काम किया है जो टॉमकैट में सक्षम है:

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 डेवलपर्स के लिए थोड़ा सा अतिरिक्त (एपीआई> = 8 उर्फ ​​2.2 पर): android.util.Base64.encode (userCredentials.getBytes (), Base64.DEFAULT); Base64.DEFAULT बेस 64 एनकोडिंग के लिए RFC2045 का उपयोग करना बताता है।
डेनिस ग्लैडकी

@ डेनिस, क्या आप मुझे बताएंगे कि हेडर का उपयोग क्यों करना चाहिए। मुझे एंड्रॉइड से कुछ क्रेडेंशियल्स को मान्य करना होगा जो मैं xammp पर php का उपयोग कर रहा हूं। मुझे इसके लिए कैसे जाना चाहिए जैसा कि मुझे पता नहीं है कि हेडर के साथ php कोड कैसे लिखा जाता है
पंकज निमगडे

11
postDataआपके उदाहरण में चर कहाँ से आया?
ग्लेनपेटर्सन

22
जब सभी लोग उन्हें हेडर कहते हैं तो उन्हें "RequestProperty" क्यों कहा जाता है ??
फिलिप रीगो

2
Java8 संस्करण के लिए एक जोड़: बेस 64 वर्ग थोड़ा बदला हुआ है। डिकोडिंग का उपयोग करना चाहिए:String basicAuth = "Basic " + java.util.Base64.getEncoder().encodeToString(userCredentials.getBytes());
मिहेलो स्टुपर

17

बस कारण है कि मैं ऊपर दिए गए उत्तरों में इस जानकारी को नहीं देखता हूं, जिस कारण से कोड स्निपेट मूल रूप से पोस्ट किया गया है वह सही ढंग से काम नहीं करता है क्योंकि encodedBytesचर byte[]एक Stringमान नहीं है । आप पार कर लेते हैं byte[]एक करने के लिए new String()नीचे के रूप में, कोड स्निपेट पूरी तरह से काम करता है।

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

11

यदि आप जावा 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.NO_WRAP));
}

2
@ d3dave। स्ट्रिंग को बाइट ऐरे से बनाया गया था और "बेसिक" के साथ जोड़ा गया था। ओपी कोड में समस्या यह थी कि वह "बेसिक" को बाइट [] के साथ संक्षिप्त करता है और इसे हेडर के रूप में भेजता है।
युरिन

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()माना जाता है?
नथानिएल फोर्ड

नमस्ते, यह आराम-अस्सर्ड (परीक्षण बाकी आपी) के लिए आधार उपयोग है। मैंने कहा कि कोड को बताते हैं।
इय्युल सुलेमान

-1

चरण 1: HttpURLConnection ऑब्जेक्ट प्राप्त करें

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

चरण 2: सेटRequestProperty विधि का उपयोग कर 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));
}

संदर्भ लिंक

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.