การเพิ่มส่วนหัวสำหรับ 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);
        }

ใช้งานได้สำหรับฉันคุณจะบอกได้อย่างไรว่าส่วนหัวถูกส่งและไม่ได้รับ
Tomasz Nurkiewicz

1
ขออภัยถ้าเสียงนี้เป็นใบ้ แต่คุณโทรหาconnect()URLConnection ที่ไหน
Vikdor

ฉันไม่แน่ใจว่าสิ่งนี้มีผล แต่คุณสามารถลองเพิ่มconnection.setRequestMethod("GET");(หรือ POST หรืออะไรก็ได้ที่คุณต้องการ)?
noobed

1
คุณเริ่มต้นauthorizationกับสตริงว่าง ถ้าอย่างใดอย่างหนึ่งusernameหรือpasswordเป็นโมฆะก็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 aka 2.2): android.util.Base64.encode (userCredentials.getBytes (), Base64.DEFAULT); Base64.DEFAULT บอกให้ใช้ RFC2045 สำหรับการเข้ารหัส base64
เดนิส Gladkiy

@ Denis คุณจะโปรดบอกฉันว่าทำไมควรใช้ส่วนหัว ฉันต้องตรวจสอบข้อมูลประจำตัวบางอย่างจาก android ที่ฉันใช้ php บน xammp ฉันจะไปได้อย่างไร เพราะฉันไม่รู้วิธีเขียนโค้ด php ด้วยส่วนหัว
Pankaj Nimgade

11
ตัวแปรpostDataมาจากตัวอย่างของคุณที่ไหน
GlenPeterson

22
ทำไมพวกเขาถึงเรียกว่า "RequestProperty" เมื่อทุกคนเรียกพวกเขาว่าเป็นส่วนหัว?
ฟิลิป Rego

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

2
@ d3dave สตริงถูกสร้างจากอาร์เรย์ไบต์และต่อเชื่อมกับ "พื้นฐาน" ปัญหาในรหัส OP คือเขาตัดแบ่ง "พื้นฐาน" กับไบต์ [] และส่งเป็นส่วนหัว
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()ควรจะเป็น?
นาธาเนียลฟอร์ด

สวัสดีนี่คือการใช้งานพื้นฐานสำหรับ Rest-Assurd (การทดสอบ Api ที่เหลือ) ฉันเพิ่มอธิบายรหัส
Eyal Sooliman

-1

ขั้นตอนที่ 1: รับวัตถุ HttpURLConnection

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

ขั้นตอนที่ 2: เพิ่มส่วนหัวใน HttpURLConnection โดยใช้เมธอด 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));
}

ลิงค์อ้างอิง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.