如何使用 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 包中导入的。您可以根据您的输入来源类似地使用FormParamQueryParam

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 负责细节。所以对于基本的东西,这就是你所需要的。