Kesalahan sintaksis ilegal saat membuat URI

Saya mencoba membuat URI untuk mengambil catatan delta dari API ServiceNow. Saat menjalankan program saya, saya membuat filter dan menggabungkannya dengan uri asli dan dengan menggunakan metode get dari RestAssured, saya mengekstrak hasilnya. Meskipun langkah-langkah di atas berfungsi untuk ekstrak penuh tetapi entah bagaimana ketika saya mencoba membuat URI dengan kondisi filter, saya mendapatkan kesalahan karakter ilegal.

Saya telah menulis fungsi berikut, untuk mendapatkan data dari 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 yang dihasilkan oleh fungsi di atas //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;
    }    

Dalam metode utama, saya memanggil getURIIncrementalExtract diikuti dengan getResponseByPath.

Saya mendapatkan pengecualian sintaksis ilegal setiap kali saya mencoba menambahkan filter sysparm_query. Jika saya menghapus filter yaitu "sysparm_query=col_updated_on>=2017-09-30", itu berfungsi dengan baik.

Saya berharap untuk membuat dan menggunakan URI untuk data yang difilter juga. Saya pikir cara saya membuat URI bisa saja salah. Bisakah seseorang berbagi pendekatan yang tepat. Tolong beri tahu saya jika informasi lebih lanjut diperlukan.


person Sunny    schedule 07.10.2019    source sumber
comment
Anda tidak boleh memiliki karakter [ dan ] di nama host ...   -  person Stephen C    schedule 07.10.2019
comment
Namun menurut saya masalah sebenarnya adalah beberapa karakter dalam parameter kueri perlu di-escape. Jika Anda akan menggunakan string bashing untuk merakit URL, Anda perlu memahami seluk-beluk sintaks URL/URI. Lebih baik (lebih sederhana) menggunakan metode perpustakaan untuk melakukan perakitan. Misalnya: stackoverflow.com/questions/19538431/   -  person Stephen C    schedule 07.10.2019
comment
Hai Stephen, Terima kasih telah menanggapi pertanyaan saya. Mohon maaf atas kebingungan yang disebabkan oleh contoh URI saya, tetapi tanda kurung siku telah digunakan sebagai pengganti string sebenarnya. URI sebenarnya tidak memiliki [ atau ]. Saya sedang mencari pembuat string. Akan memperbarui jika saya dapat menyelesaikan ini.   -  person Sunny    schedule 07.10.2019


Jawaban (1)


Anda perlu mengaktifkan pengkodean dalam permintaan RestAssured dan meneruskan parameter menggunakan metode 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);

Jika Anda perlu membuat seluruh url di tempat lain coba gunakan URLEncoder (tetapi Anda juga harus menonaktifkan pengkodean URL di RestAssured untuk mencegah pengkodean ganda):

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
Terima kasih banyak Bhusak dan Stephen. Saya sebenarnya membuat menggunakan pembuat string (mengikuti saran Stephen) dan sekarang menyadari bahwa jawaban bhusak juga sangat bagus. - person Sunny; 07.10.2019