如何使用 Dropwizard 解析 RESTful API 参数
How to parse RESTful API params with Dropwizard
假设我有:
@GET
public UserList fetch(@PathParam("user") String userId) {
// Do stuff here
}
现在,假设我有自己的 userId
类型,我们称它为 UserId
。当它被传递到 fetch
方法时,是否可以将 String
解析为 UserId
,即:
@GET
public UserList fetch(@PathParam("user") UserId userId) {
// Do stuff here
}
我意识到一旦我进入方法内部就可以解析字符串,但如果我的方法获得我想要的类型会更方便。
好吧,我发现您尝试使用请求正文进行 GET 调用不是很有帮助。请阅读 Paul 的 answer here -
you can send a body with GET, and no, it is never useful to do so
最好的做法是,按如下方式进行 PUT 或 POST 调用 (PUT vs POST in REST) -
@POST
@Path("/some-path/{some-query-param}")
public Response getDocuments(@ApiParam("user") UserId userId,
@PathParam("some-query-param") String queryParam) {
UserId userIdInstance = userId; // you can use the request body further
注意 - 使用的 ApiParam
注释是从 com.wordnik.swagger.annotations
包中导入的。您可以根据您的输入来源类似地使用FormParam
、QueryParam
。
Dropwizard is using Jersey 用于 HTTP<->Java POJO 编组。您可以对某些参数使用 Jersey @*Param
(@FormParam、@QueryParam 等)的各种注释。
如果您需要使用 map/marshall to/from Java POJO,请查看 test cases in Dropwizard:
@Path("/valid/")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class ValidatingResource {
@POST
@Path("foo")
@Valid
public ValidRepresentation blah(@NotNull @Valid ValidRepresentation representation, @QueryParam("somethingelse") String xer) {
return new ValidRepresentation();
}
这定义了一个响应 HTTP POST 方法的 API 端点,该方法需要 ValidRepresentation 对象和 "somethingelse" 作为 HTTP 方法查询参数。端点将仅在提供 JSON 参数时响应,并且将 return 仅 JSON 对象(@Produces 和 @Consumes 在 class 级别)。 @NotNull 要求该对象是调用成功所必需的,@Valid 指示 Dropwizard 在调用端点之前调用 Hibernate 验证器来验证对象。
有效表示 class 是 here:
package io.dropwizard.jersey.validation;
import com.fasterxml.jackson.annotation.JsonProperty;
import org.hibernate.validator.constraints.NotEmpty;
public class ValidRepresentation {
@NotEmpty
private String name;
@JsonProperty
public String getName() {
return name;
}
@JsonProperty
public void setName(String name) {
this.name = name;
}
}
POJO 使用 Jackson 注释来定义此对象的 JSON 表示形式。 @NotEmtpy 是来自 Hibernate 验证器的注解。
Dropwizard、Jersey 和 Jackson 负责细节。所以对于基本的东西,这就是你所需要的。
假设我有:
@GET
public UserList fetch(@PathParam("user") String userId) {
// Do stuff here
}
现在,假设我有自己的 userId
类型,我们称它为 UserId
。当它被传递到 fetch
方法时,是否可以将 String
解析为 UserId
,即:
@GET
public UserList fetch(@PathParam("user") UserId userId) {
// Do stuff here
}
我意识到一旦我进入方法内部就可以解析字符串,但如果我的方法获得我想要的类型会更方便。
好吧,我发现您尝试使用请求正文进行 GET 调用不是很有帮助。请阅读 Paul 的 answer here -
you can send a body with GET, and no, it is never useful to do so
最好的做法是,按如下方式进行 PUT 或 POST 调用 (PUT vs POST in REST) -
@POST
@Path("/some-path/{some-query-param}")
public Response getDocuments(@ApiParam("user") UserId userId,
@PathParam("some-query-param") String queryParam) {
UserId userIdInstance = userId; // you can use the request body further
注意 - 使用的 ApiParam
注释是从 com.wordnik.swagger.annotations
包中导入的。您可以根据您的输入来源类似地使用FormParam
、QueryParam
。
Dropwizard is using Jersey 用于 HTTP<->Java POJO 编组。您可以对某些参数使用 Jersey @*Param
(@FormParam、@QueryParam 等)的各种注释。
如果您需要使用 map/marshall to/from Java POJO,请查看 test cases in Dropwizard:
@Path("/valid/")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class ValidatingResource {
@POST
@Path("foo")
@Valid
public ValidRepresentation blah(@NotNull @Valid ValidRepresentation representation, @QueryParam("somethingelse") String xer) {
return new ValidRepresentation();
}
这定义了一个响应 HTTP POST 方法的 API 端点,该方法需要 ValidRepresentation 对象和 "somethingelse" 作为 HTTP 方法查询参数。端点将仅在提供 JSON 参数时响应,并且将 return 仅 JSON 对象(@Produces 和 @Consumes 在 class 级别)。 @NotNull 要求该对象是调用成功所必需的,@Valid 指示 Dropwizard 在调用端点之前调用 Hibernate 验证器来验证对象。
有效表示 class 是 here:
package io.dropwizard.jersey.validation;
import com.fasterxml.jackson.annotation.JsonProperty;
import org.hibernate.validator.constraints.NotEmpty;
public class ValidRepresentation {
@NotEmpty
private String name;
@JsonProperty
public String getName() {
return name;
}
@JsonProperty
public void setName(String name) {
this.name = name;
}
}
POJO 使用 Jackson 注释来定义此对象的 JSON 表示形式。 @NotEmtpy 是来自 Hibernate 验证器的注解。
Dropwizard、Jersey 和 Jackson 负责细节。所以对于基本的东西,这就是你所需要的。