Недопустимая синтаксическая ошибка при создании 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;
    }    

В основном методе я вызываю getURIIncrementalExtract, за которым следует 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
Привет, Стивен, спасибо за ответ на мой запрос. Приносим извинения за путаницу, которую вызвал мой пример 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
Большое спасибо Бхусаку и Стивену. На самом деле я создал с помощью построителя строк (по предложению Стивена) и теперь понял, что ответ Бхусака тоже очень хорош. - person Sunny; 07.10.2019