【问题标题】:Illegal syntax error while creating a URI创建 URI 时出现非法语法错误
【发布时间】:2019-10-07 01:05:14
【问题描述】:

我正在尝试生成一个用于从 ServiceNow API 获取增量记录的 URI。在执行我的程序时,我创建了一个过滤器并将其与原始 uri 连接,并使用 RestAssured 的 get 方法提取结果。虽然上述步骤适用于完全提取,但不知何故,当我尝试生成带有过滤条件的 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;
    }    

在 main 方法中,我调用 getURIIncrementalExtract,然后调用 getResponseByPath。

每当我尝试添加 sysparm_query 过滤器时,都会遇到非法语法异常。 如果我删除过滤器,即“sysparm_query=col_updated_on>=2017-09-30”,它工作正常。

我也期望为过滤后的数据生成和使用 URI。我认为我生成 URI 的方式可能是错误的。有人可以分享一个正确的方法吗? 如果需要更多信息,请告诉我。

【问题讨论】:

  • 主机名中不能有[] 字符...
  • 但我认为真正的问题是查询参数中的某些字符需要转义。如果要使用字符串 bashing 来组装 URL,则需要了解 URL / URI 语法的复杂性。使用库方法进行组装会更好(更简单)。例如:stackoverflow.com/questions/19538431/…
  • 嗨,斯蒂芬,感谢您回复我的询问。对我的示例 URI 造成的混乱表示歉意,但方括号已被用作实际字符串的替代品。实际的 URI 没有“[”或“]”。我正在研究字符串生成器。如果我能解决这个问题,会更新。

标签: java rest-assured


【解决方案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(但您还应该在 RestAssured 中禁用 URL 编码以防止双重编码):

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);

【讨论】:

  • 非常感谢布萨克和斯蒂芬。我实际上是使用字符串生成器创建的(遵循斯蒂芬的建议),现在意识到 bhusak 的答案也非常好。
猜你喜欢
  • 2018-06-14
  • 1970-01-01
  • 1970-01-01
  • 2020-01-12
  • 2016-10-24
  • 2019-05-03
  • 2012-07-27
  • 2014-04-29
  • 1970-01-01
相关资源
最近更新 更多