带有HTTP 405错误的Jersey PathParam

时间:2017-06-14 07:41:37

标签: java rest jersey jax-rs

我正在为我的休息服务器使用jersey,而当我尝试将POST请求转发给相对GET资源时,我收到了HTTP 405错误。

@Path("/")
public class MyResource {

    @POST
    @Path("/{method}")
    @Produces(MediaType.APPLICATION_JSON)
    public String postRequest(@PathParam("method") String method, @Context UriInfo uriInfo, String body) throws IOException {
        JsonParser parser = new JsonParser();
        JsonObject root = parser.parse(body).getAsJsonObject();
        JsonObject params = root;

        if (root.has("method")) {
            method = root.get("method").getAsString();
            params = root.getAsJsonObject("params");
        }

        UriBuilder forwardUri = uriInfo.getBaseUriBuilder().path(method);
        for (Map.Entry<String, JsonElement> kv : params.entrySet()) {
            forwardUri.queryParam(kv.getKey(), kv.getValue().getAsString());
        }

        return new SimpleHttpClient().get(forwardUri.toString());

    }

    @GET
    @Path("/mytest")
    @Produces(MediaType.APPLICATION_JSON)
    public String getTest(@QueryParam("name") String name)   {
        return name;
    }

}

curl -X POST -d {“method”:“mytest”,“params”:{“name”:“jack”}} localhost / anythingbutmytest

curl -X GET localhost / mytest?name = jack

这两个卷曲上面工作正常。但是当我尝试这样请求时,我得到405错误:

curl -X POST -d {“method”:“mytest”,“params”:{“name”:“jack”}} localhost / mytest

javax.ws.rs.NotAllowedException: HTTP 405 Method Not Allowed
at org.glassfish.jersey.server.internal.routing.MethodSelectingRouter.getMethodRouter(MethodSelectingRouter.java:466)
at org.glassfish.jersey.server.internal.routing.MethodSelectingRouter.access$000(MethodSelectingRouter.java:94)   
......

我该怎么办?

-------------------------------------更新--------- ----------------------------

curl -X POST -d {“method”:“mytest”,“params”:{“name”:“jack”}} localhost / mytest

当我添加如下的帖子方法时,这个卷曲工作正常。 但是我会为每个GET方法编写一个相同的POST方法,还有其他解决方案吗?

@POST @Path("/mytest") @Produces(MediaType.APPLICATION_JSON) public String postMyTest(@Context UriInfo uriInfo, String body) throws Exception { return postRequest(uriInfo.getPath(), uriInfo, body); }

此外,还有其他方法可以将POST请求重新路由到同一个类中的方法而不构建新的HTTP请求吗?

1 个答案:

答案 0 :(得分:0)

你应该

    @POST
    @Path("/mytest")

而不是&#34; getTest&#34; method.Reason在下面。

命令

curl -X POST -d {"method":"mytest","params":{"name":"jack"}} localhost/anythingbutmytest

将接受

@Path("/{method}") .

但是

curl -X POST -d {"method":"mytest","params":{"name":"jack"}} localhost/mytest
由于

不会接受

@GET
@Path("/mytest")

POST与GET不匹配。