JerseyTest 框架路径编码替换 ?与 %3F
JerseyTest framework path encoding replaces ? with %3F
我有一个失败的测试,应该是通过的。该服务工作正常,但 JerseyTest JUnit 测试失败,状态为 400。
使用 Postman 或浏览器,当我针对已部署的服务尝试此 URL 时:
http://localhost:8080/myService/123?appId=local&userId=jcn
我得到正确的结果,状态 200 并在日志中看到以下内容:
INFO: 4 * Server has received a request on thread http-nio-8080-exec-5
4 > GET http://localhost:8080/myService/123?appId=local&userId=jcn
注意 ?在 URL 中,这是正确的。
但是当我在我的 JeryseyTest 扩展 Junit 中尝试这个单元测试时 class:
@Test
public void getWithCorrectUrlExecutesWithoutError()
{
String x = target("myService/123?appId=local&userId=jcn").request().get(String.class);
}
失败,状态为 400,我在日志中看到:
INFO: 1 * Server has received a request on thread grizzly-http-server-0
1 > GET http://localhost:9998/myService/123%3FappId=local&userId=jcn
注意 ?已替换为 %3F。
我不明白发生了什么。如果我在浏览器中尝试“%3F”URL,我会在单元测试中看到相同的 400 错误。所以我有点确定 url 的编码是问题所在。
这是我的 Jersey 资源,部分列表因为它有点长,但我很确定这是相关部分:
@Component
@Path("/myService")
public class MyResource
{
@Autowired
SomeDao someDao;
@NotBlank
@QueryParam("appId")
private String appId;
@NotBlank
@QueryParam("userId")
private String userId;
@GET
@Path("/{id}")
@Produces(MediaType.APPLICATION_JSON)
public Status getStatus(@NotBlank @PathParam("id") String id)
{
errors = new ArrayList<>();
Status retVal;
if(validateId(id))
{
retVal = someDao.getStatus(id);
}
else
{
throw new BadParameterException(String.join(" | ", errors));
}
return retVal;
}
}
您可以使用 queryParam
method on your WebTarget
实例:
String x = target("myService/123")
.queryParam("appId", "local")
.queryParam("userId", "jcn")
.request()
.get(String.class);
我有一个失败的测试,应该是通过的。该服务工作正常,但 JerseyTest JUnit 测试失败,状态为 400。
使用 Postman 或浏览器,当我针对已部署的服务尝试此 URL 时:
http://localhost:8080/myService/123?appId=local&userId=jcn
我得到正确的结果,状态 200 并在日志中看到以下内容:
INFO: 4 * Server has received a request on thread http-nio-8080-exec-5
4 > GET http://localhost:8080/myService/123?appId=local&userId=jcn
注意 ?在 URL 中,这是正确的。
但是当我在我的 JeryseyTest 扩展 Junit 中尝试这个单元测试时 class:
@Test
public void getWithCorrectUrlExecutesWithoutError()
{
String x = target("myService/123?appId=local&userId=jcn").request().get(String.class);
}
失败,状态为 400,我在日志中看到:
INFO: 1 * Server has received a request on thread grizzly-http-server-0
1 > GET http://localhost:9998/myService/123%3FappId=local&userId=jcn
注意 ?已替换为 %3F。
我不明白发生了什么。如果我在浏览器中尝试“%3F”URL,我会在单元测试中看到相同的 400 错误。所以我有点确定 url 的编码是问题所在。
这是我的 Jersey 资源,部分列表因为它有点长,但我很确定这是相关部分:
@Component
@Path("/myService")
public class MyResource
{
@Autowired
SomeDao someDao;
@NotBlank
@QueryParam("appId")
private String appId;
@NotBlank
@QueryParam("userId")
private String userId;
@GET
@Path("/{id}")
@Produces(MediaType.APPLICATION_JSON)
public Status getStatus(@NotBlank @PathParam("id") String id)
{
errors = new ArrayList<>();
Status retVal;
if(validateId(id))
{
retVal = someDao.getStatus(id);
}
else
{
throw new BadParameterException(String.join(" | ", errors));
}
return retVal;
}
}
您可以使用 queryParam
method on your WebTarget
实例:
String x = target("myService/123")
.queryParam("appId", "local")
.queryParam("userId", "jcn")
.request()
.get(String.class);