ข้อผิดพลาดทางไวยากรณ์ที่ไม่ถูกต้องขณะสร้าง URI

ฉันกำลังพยายามสร้าง URI เพื่อดึงข้อมูลบันทึกเดลต้าจาก ServiceNow API ในขณะที่รันโปรแกรมของฉัน ฉันสร้างตัวกรองและเชื่อมต่อตัวกรองเดียวกันกับ uri ดั้งเดิม และโดยใช้วิธี get ของ RestAssured ฉันจะดึงผลลัพธ์ออกมา แม้ว่าขั้นตอนข้างต้นใช้งานได้สำหรับการแตกไฟล์แบบเต็ม แต่เมื่อฉันพยายามสร้าง URI ที่มีเงื่อนไขตัวกรอง ฉันได้รับข้อผิดพลาดของอักขระที่ไม่ถูกต้อง

ฉันได้เขียนฟังก์ชันต่อไปนี้เพื่อรับข้อมูลจาก API: -

public static void getURIIncrementalExtract(String tblName, String params) {
        RestAssured.baseURI = null;
        String params = ""; //For stackoverflow
        String displayValueParam = "sysparm_display_value=true&";
        String dateParams = "";
        dateParams = "sysparm_query=col_updated_on>=2017-09-30"; //+     fromDate
        String uri = "https://[servicenowAPIadd].com/api/now/table/" +     tblName + "?" + displayValueParam + params + dateParams;
        System.out.println(uri); //URI generated is working correctly in     postman.
        RestAssured.baseURI = uri;
    }

//URI ที่สร้างโดยฟังก์ชันด้านบน //https://[servicenowAPIadd].com/api/now/table/[DBtablename]?sysparm_display_value=true&sysparm_query=col_updated_on>=2017-09-30

public static Response getResponseByPath() {
        Response response = null;
        try {
            response = RestAssured.given()
                    .when()
                    .auth()
                    .basic(username, password)
                    .get(RestAssured.baseURI);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("Exception in getResponseByPath:-" + e.toString());
        }
        return response;
    }    

ในวิธีการหลัก ฉันเรียก getURIIncreationalExtract ตามด้วย getResponseByPath

ฉันได้รับข้อยกเว้นทางไวยากรณ์ที่ไม่ถูกต้องทุกครั้งที่ฉันพยายามเพิ่มตัวกรอง sysparm_query ถ้าฉันลบตัวกรองเช่น "sysparm_query=col_updated_on>=2017-09-30" มันก็ทำงานได้ดี

ฉันคาดว่าจะสร้างและใช้ URI สำหรับข้อมูลที่กรองเช่นกัน ฉันคิดว่าวิธีที่ฉันสร้าง URI อาจผิดได้ ใครสามารถแบ่งปันแนวทางที่ถูกต้องได้โปรด โปรดแจ้งให้เราทราบหากต้องการข้อมูลเพิ่มเติม


person Sunny    schedule 07.10.2019    source แหล่งที่มา
comment
คุณไม่สามารถมีอักขระ [ และ ] ตัวในชื่อโฮสต์ ...   -  person Stephen C    schedule 07.10.2019
comment
แต่ฉันคิดว่าปัญหาที่แท้จริงคือต้องหลีกเลี่ยงอักขระบางตัวในพารามิเตอร์การสืบค้น หากคุณกำลังจะใช้การทุบตีสตริงเพื่อประกอบ URL คุณจะต้องเข้าใจความซับซ้อนของไวยากรณ์ URL / URI เป็นการดีกว่า (ง่ายกว่า) หากใช้วิธีการไลบรารีเพื่อทำแอสเซมบลี ตัวอย่างเช่น: stackoverflow.com/questions/19538431/   -  person Stephen C    schedule 07.10.2019
comment
เฮ้ Stephen ขอบคุณที่ตอบคำถามของฉัน ขออภัยสำหรับความสับสนที่ URI ตัวอย่างของฉันเกิดขึ้น แต่มีการใช้วงเล็บเหลี่ยมแทนสตริงจริง URI จริงไม่มี [ หรือ ] ฉันกำลังดูตัวสร้างสตริงอยู่ จะอัปเดตหากฉันสามารถแก้ไขปัญหานี้ได้   -  person Sunny    schedule 07.10.2019


คำตอบ (1)


คุณต้องเปิดใช้งานการเข้ารหัสในคำขอ RestAssured และส่งพารามิเตอร์โดยใช้วิธี queryParam(String, String):

RestAssured.baseURI = "https://servicenowAPIadd.com";
RestAssured
    .given()
    .urlEncodingEnabled(true)               //Encoding should be enabled by default anyway
    .queryParam("sysparm_display_value", "true")
    .queryParam("sysparm_query", "col_updated_on>=2017-09-30")
    .when()
    .get("/api/now/table/" + tableName);

ในกรณีที่คุณต้องการสร้าง URL ทั้งหมดในสถานที่อื่นให้ลองใช้ URLEncoder (แต่คุณควรปิดการใช้งานการเข้ารหัส URL ใน RestAssured เพื่อป้องกันการเข้ารหัสซ้ำ):

String dateParams = "sysparm_query=" + URLEncoder.encode("col_updated_on>=2017-09-30", "UTF-8"); //Encode your query params here
String uri = "https://servicenowAPIadd.com/api/now/table?" + dateParams;
RestAssured
    .given()
    .urlEncodingEnabled(false)
    .get(uri);
person bhusak    schedule 07.10.2019
comment
ขอบคุณมากภูศักดิ์และสตีเฟน จริงๆ แล้วฉันสร้างขึ้นโดยใช้ตัวสร้างสตริง (ตามคำแนะนำของ Stephen) และตอนนี้ก็ตระหนักว่าคำตอบของภูสักก็ดีมากเช่นกัน - person Sunny; 07.10.2019