当前位置: 首页 > 面试题库 >

通过查询参数选择球衣方法

汪德明
2023-03-14
问题内容

我需要实现一个使用第一个查询参数来标识操作的Web服务,即客户端调用将类似于:http://localhost:8080/ws/operation?infohttp://localhost:8080/ws/operation?create&name=something

似乎我无法使用@Path注释来区分方法,因为区别特征在于查询参数。以下示例也引发了异常:

package com.example.ws;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;

@Path("/operation")
public class Operation {

    @GET 
    public String info(@QueryParam("info") String info) {
        return "info";
    }

    @GET 
    public String create(@QueryParam("create") String create) {
        return "create";
    }
}

有没有一种方法可以根据查询参数指定要使用的方法?还是我真的必须定义一种方法并在其中检查是否设置了某些查询参数?


问题答案:

我认为Claudio是正确的-您可以使用Jersey,但是您将自己处理查询参数,因为它仅在路径上匹配。

您可以注入UriInfo并从中提取查询参数:

@Path("/operation")
public class Operation {

    @Context
    protected UriInfo info;

    @GET
    public String operation() {
        if (info.getQueryParameters().containsKey("create"))
            // do stuff
        else if (info.getQueryParameters().containsKey("info"))
            // other stuff
    }

}

您可以从Jersey切换到另一个框架。我相信Spring
可以根据查询参数路由到多种方法。

如您所述,也许您可​​以编写一些更标准的内容,然后将请求重新映射到该标准。例如,您可以使用Servlet过滤器或前端服务器(如Apachehttpd或nginx)来修改请求。

从资源的角度考虑这些操作是在做什么?客户帐户,电影,股票交易等。出于争论的缘故,我们将其称为“ Foo”。您可能会使用类似以下的内容:

@Path("/foo")
public class FooResource {

    @Context
    protected UriInfo info;

    @GET
    @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
    public Foo getById(@QueryParam("id") int id) {
         // get Foo by id
         Foo = ....

         // return an instance of Foo and let Jersey convert it to XML
         // or JSON depending on the "Accept" header that the client

sent
return foo;
}

    @POST
    @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
    public Response create(Foo instance)
    {
         // let Jersey deserialize the request body from JSON or XML.
         // save the instance however you want
         int id = fooService.save(instance);

         // return a 204 "created" with a "Location" header
         URI location =

info.getAbsolutePathBuilder().path(“{id}”).build(id);
return Response.created(location).build();
}

}

听起来您的URI结构是由其他人强制执行的,因此这可能不是您的选择。如果您继续使用当前的URI结构,则应注意一个主要陷阱。

根据HTTP
1.1规范,GET请求应该是幂等的。您当前的设计似乎正在使用GET请求创建新的服务器端实例。可能会损坏…中间代理或Web浏览器可能会缓存对GET请求的响应,并阻止创建新实例。



 类似资料:
  • 我试图使用jpa组件来选择从标题中获取的id。我在文档中找到了一个使用本机select查询的示例: 我试图用${header.id}替换“1”常量: 这似乎不管用,我明白了: 也许还有别的方法可以让它发挥作用?

  • 当我将参数嵌入到下面的路径中时,我可以成功地传递参数 我应该使用‘参数’tabe只有当我做POST方法?我知道向JMeter传递参数是一个简单的问题,但我不能解决我的问题。

  • 有什么解决办法吗?有人能帮帮我吗?

  • 问题内容: 我想在存储库层中编写一些查询方法。此方法必须忽略空参数。例如: 在这种情况下,此方法必须返回Foo: 如果gooParam不为null。如果gooParam为null,则条件更改为: 有什么解决办法吗?有人能帮我吗? 问题答案: 来不及了。不确定 Bar 和 Goo 之间的关系。检查 Example是否 可以帮助您。 它为我工作。我有一个类似的情况,实体 用户 具有属性集,并且有基于属

  • 问题内容: 这个问题已经在这里有了答案 : 查找两个纬度/经度之间距离的最快方法 (15个答案) 2年前关闭。 我有和,现在在MySQL中我想将15个最近的位置放在这些坐标处,并且我打算进行以下查询: 您认为这是正确的还是其他建议? ,该怎么办,因为我想在附近的地方搜索最大50公里的波谷? 我忘了说我也可以在运行查询之前使用PHP进行任何操作。 注意: 我不能使用存储过程 。 问题答案: 这里是