Недопустимая синтаксическая ошибка при создании URI - PullRequest
1 голос
/ 07 октября 2019

Я пытаюсь сгенерировать 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;
    }    

В основном методе я вызываю getURIIncrementalExtract, за которым следует getResponseByPath.

Я получаю недопустимое синтаксическое исключение всякий раз, когда пытаюсь добавить фильтры sysparm_query. Если я удаляю фильтр, т.е. "sysparm_query = col_updated_on> = 2017-09-30", он работает нормально.

Я ожидаю также создать и использовать URI для отфильтрованных данных. Я думаю, что способ генерации URI может быть неправильным. Может кто-нибудь поделиться правильным подходом, пожалуйста. Пожалуйста, дайте мне знать, если требуется дополнительная информация.

1 Ответ

1 голос
/ 07 октября 2019

Вам необходимо включить кодирование в запросе 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);
...