创建 URI 时出现非法语法错误
Illegal syntax error while creating a URI
我正在尝试生成用于从 ServiceNow API 获取增量记录的 URI。在执行我的程序时,我创建了一个过滤器并将其与原始 uri 连接起来,并通过使用 RestAssured 的 get 方法提取了结果。虽然上述步骤适用于完整提取,但不知何故,当我尝试生成具有过滤条件的 URI 时,出现非法字符错误。
我编写了以下函数,用于从 API 获取数据:-
public static void getURIIncrementalExtract(String tblName, String params) {
RestAssured.baseURI = null;
String params = ""; //For Whosebug
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 的方式可能是错误的。有人可以分享正确的方法吗?
如果需要更多信息,请告诉我。
您需要在 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);
我正在尝试生成用于从 ServiceNow API 获取增量记录的 URI。在执行我的程序时,我创建了一个过滤器并将其与原始 uri 连接起来,并通过使用 RestAssured 的 get 方法提取了结果。虽然上述步骤适用于完整提取,但不知何故,当我尝试生成具有过滤条件的 URI 时,出现非法字符错误。
我编写了以下函数,用于从 API 获取数据:-
public static void getURIIncrementalExtract(String tblName, String params) {
RestAssured.baseURI = null;
String params = ""; //For Whosebug
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 的方式可能是错误的。有人可以分享正确的方法吗? 如果需要更多信息,请告诉我。
您需要在 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);