使用 PathParam 中的 PathSegment 测试 POST 请求时断言失败

Assertion failure when testing POST request with PathSegment in PathParam

我有一个需要多个条目的 REST API POST 请求。这些条目是使用 PathSegment 提取的。 API 正在工作,但是当我使用 Rest Assured 编写测试用例时,我遇到断言失败。我正在为 APIs 使用 JAX-RS 和 Jersey。

我已经通过 SO 和其他一些论坛寻求答案,但没有令人满意的答案。

我的 REST API 代码是:

  @Produces(MediaType.APPLICATION_JSON)
  @Path("/order/{id}/{var1: items}/{var2: qty}")
  public final String orderMultipleItems(@PathParam("var1") final PathSegment itemPs, @PathParam("var2") final PathSegment qtyPs,
      @PathParam("id") final int id) {
    HashMap<Integer, Integer> items = new HashMap<Integer, Integer>();

    //rest of the code
}

这是我的放心码:

@Test
  public final void testOrderMultipleItems() throws URISyntaxException, AssertionError {
    String msg= given().contentType("application/json").when()
        .post(TestUtil.getURI("/api/customer/order/1002/items;item=3006;item=3005/qty;q=1;q=1"))
        .getBody().asString();
    assertNotEquals("Order(s) Received", msg);
  }

我在测试时收到 404,但当我通过 curl 运行 POST 请求时收到 200。我在 post 请求的测试用例中是否犯了错误?

如有任何建议,我们将不胜感激。

当您使用 curl 向服务器发送请求 URI 时,它按原样提交:

http://localhost/api/customer/order/1002/items;item=3006;item=3005/qty;q=1;q=1

但是,当您通过 RestAssured(使用 post)发送 URI 时,RestAssured 会将特殊字符“;”编码为“%3B' 和 '=' 到 '%3D' 并且请求 URI 变成这样:

http://localhost/api/customer/order/1002/items%3Bitem%3D3006%3Bitem%3D3005/qty%3Bq%3D1%3Bq%3D1

服务器无法理解。就是这个问题。

因此,您可以在发送请求之前使用以下代码来避免这种情况,

RestAssured.urlEncodingEnabled = false;

希望这能解决您的问题。