Java 创建URI时出现非法语法错误

Java 创建URI时出现非法语法错误,java,rest-assured,Java,Rest Assured,我正在尝试生成一个URI,用于从ServiceNow API获取增量记录。在执行我的程序时,我创建了一个过滤器,并将其与原始uri连接起来,然后使用restasured的get方法提取结果。虽然上面的步骤对完全提取有效,但是当我尝试生成带有筛选条件的URI时,我得到了一个非法字符错误 我编写了以下函数,用于从API获取数据:- public static void getURIIncrementalExtract(String tblName, String params) {

我正在尝试生成一个URI,用于从ServiceNow API获取增量记录。在执行我的程序时,我创建了一个过滤器,并将其与原始uri连接起来,然后使用restasured的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 //>=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_查询过滤器时,就会出现非法语法异常。 如果我删除过滤器,即“sysparm\u query=col\u updated\u on>=2017-09-30”,它工作正常

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

您需要在重新启动的请求中启用编码,并使用
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,请尝试使用(但您还应该在RestAssured中禁用url编码以防止双重编码):


主机名中不能有
[
]
字符……但我认为真正的问题是查询参数中的一些字符需要转义。如果要使用字符串碰撞来组装URL,则需要了解URL/URI语法的复杂性。使用库方法进行组装更好(更简单)。例如:嘿,斯蒂芬,谢谢你回答我的问题。对于我的示例URI造成的混乱,我深表歉意,但方括号已被用作实际字符串的替换。实际URI没有“[”或“]”。不过我正在研究字符串生成器。如果我能解决这个问题,我会更新。非常感谢Bhusak和Stephen。我实际上是使用字符串生成器创建的(遵循Stephen的建议),现在意识到bhusak的答案也非常好。
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);