gpt4 book ai didi

java - Jersey2.0及以上版本如何创建RESTful web服务客户端

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:46:01 30 4
gpt4 key购买 nike

似乎有很多关于通过 Jersey 1.x 创建 RESTful 客户端的示例,但不是 Jersey 2.0 或更高版本。我引用了其他问题和 Jersey 的网站,但由于 Jersey 2.0 与上一个版本之间的差异,我仍然无法为 REST 创建客户端。所以我想请教一些建议。

到目前为止,我的编码是这样的。

ClientConfig config = new ClientConfig();
Client client = ClientBuilder.newClient(config);
WebTarget target = client.target("http://localhost:8080/CustomerBack2211/webresources/entities.customer");

Invocation.Builder invocationBuilder = target.request(MediaType.TEXT_XML_TYPE);
Response response = invocationBuilder.get();
System.out.println(response.getStatus());
System.out.println(response.readEntity(String.class));

这会产生 406 错误。

但是,当我尝试通过 Glassfish 服务器测试 RESTful 服务时,测试工作正常,并且服务器端类的 @GET 方法具有 @Produces({"application/xml", "application/json"})。所以我不明白为什么上面的编码会在 Java 应用程序上产生 406 错误。

(即客户端有如下方式的@GET方法)

@GET
@Path("{id}")
@Produces({"application/xml", "application/json"})
public Customer find(@PathParam("id") Integer id) {
return super.find(id);
}

@GET
@Override
@Produces({ "application/xml"})
public List<Customer> findAll() {
return super.findAll();
}

你们有没有看到我做错了什么,或者你们能不能推荐一个 RESTful 客户端的例子?任何建议都会有所帮助...提前致谢!


此外,如果您能提供有关如何使用适当的参数调用 GET、PUT 和 DELETE 等方法 的信息,我将不胜感激。当我在 Glassfish RESTful 测试中测试服务器端类时,我只需要输入一个 ID 号(即整数值)。但是,我似乎需要将“Class”和/或“Entity”值设置为参数,但我在 Jersey 网站上看不到与它们相关的任何信息。

最佳答案

第一段代码:

406 means Not Acceptable .

查看您的request() 方法target.request(MediaType.TEXT_XML_TYPE)。来自 request() 的 Javadoc如果状态

Invocation.Builder request(MediaType... acceptedResponseTypes)

Start building a request to the targeted web resource and define the accepted response media types. Invoking this method is identical to:

webTarget.request().accept(types);

基本上,在您的请求中,您是说您只会Accept: text/plain。现在看看你的资源方法。查看 @Produces。它们都没有“产生”text/plain。都是json或者xml。这就是你得到异常(exception)的原因。在客户端将接受更改为 application/xml(或 MediaType.APPLICATION_XML),您应该不会再收到此错误。

对于第二个问题:我假设你的意思是为什么当你从浏览器测试它时它会工作。

如果您通过简单地键入 url 从浏览器发送请求,它将发送具有许多 Accept 类型的请求。如果你有 firebug(对于 FireFox)或开发者工具(对于 Chrome),如果你发送一个请求,你会看到一个类似于

的标题
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

你可以在那里看到application/xml。即使 application/xml 不存在,通配符 */* 也存在,所以基本上几乎所有媒体类型都可以作为在浏览器中工作时的返回类型.

最后一个问题:

查看 SyncInvoker 的 API ,这Invocation.Builder延伸自。您将看到不同的重载 putpost 方法,正如您提到的,其中大部分接受 Entity

有几种不同的方法来构建 Entity ,所有这些都使用一种静态方法。这里有一些

  • Entity.entity(正文,媒体类型)
  • 实体.json(正文)
  • Entity.xml(正文)

还有更多(参见上面的实体链接)。但是所有这些静态方法都返回一个 Entity。所以我们可以做类似的事情

// resource method
@POST
@Consumes(MediaType.APPLICATION_XML)
public Response getResponse(Customer customer) { ... }

// some model class
@XmlRootElement
public class Customer { ... }

// client request
Customer customer = new Customer();
Response response = target.request().post(Entity.xml(customer));

在内部,Customer 将被转换为 XML。如果您使用 Entity.json 将被转换为 JSON,但是 您需要确保您具有 JSON 提供程序依赖项。默认情况下,Jersey 不会附带一个。查看更多信息 Support for Common Media Type Representations


另请注意,使用您的方法 find,当您尝试向该方法发出请求时,请求应以整数值结尾,因为这是为 {id> 指定的类型} 路径参数。

关于java - Jersey2.0及以上版本如何创建RESTful web服务客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27284046/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com