当前位置: 首页 > 知识库问答 >
问题:

如何通过Jersey2.0或更高版本创建RESTful Web服务客户端

江佐
2023-03-14

Jersey 1创建RESTful客户端的例子似乎很多。x、 但不是泽西2.0或更高版本。我提到了其他问题和泽西岛的网站,但由于泽西岛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号(即整数值)。但是,我似乎需要将“类”和/或“实体”值设置为参数,但我在泽西网站上看不到与它们相关的任何信息。

共有1个答案

宋瀚海
2023-03-14

对于第一个代码块:

406表示不可接受。

查看您的request()方法目标。请求(MediaType.TEXT\u XML\u TYPE)。来自Javadoc ofrequest()if states

调用。生成器请求(MediaType…AcceptedResponseType)

开始构建对目标web资源的请求,并定义可接受的响应媒体类型。调用此方法与:

webTarget.request()。接受(类型);

所以基本上,在您的请求中,您是说您将只接受:text/plain。现在看看您的资源方法。查看生成的代码。它们都不会“生成”文本/纯文本。都是json或xml。这就是为什么你会得到例外。在客户端将accept更改为“应用程序/xml”(或“MediaType.application\u xml”),您将不会再收到此错误。

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

如果您通过简单地键入url从浏览器发送请求,它将以多种类型发出请求。如果您有firebug(用于FireFox)或开发人员工具(用于Chrome),如果您发出请求,您将看到类似的标题

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

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

最后一个问题:

查看SyncInvoker的API,调用。Builder从中扩展。您将看到不同的重载putpost方法,其中大部分,如您所述接受Entity

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

  • 实体。实体(实体,mediaType)

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

// 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));

在内部,客户将被转换为XML。如果您使用Entity.json将被转换为JSON,但您需要确保您有JSON提供程序依赖项。泽西岛默认不会附带一个。请参阅对通用媒体类型表示的支持

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

 类似资料:
  • 问题内容: 我知道如何使用证书保护Web服务。那是我的客户代码: 现在,如何制作“简单SSL”?如何进行SSL连接而不在客户端存储证书。(就像通过浏览器中的HTTPS连接一样) 问题答案: Java Runtime Environment确实在cacerts文件中附带了很多(使用最广泛的)证书颁发机构。如果您用来保护服务安全的证书是由那些根CA之一签名的,则您不必担心与客户端共享任何证书。 但是,

  • 我试图了解服务器-客户端网络如何为实时多人游戏工作。 假设我正在构建一个实时多人游戏,比如FPS。 如果玩家A向玩家B开枪,后端< code >服务器需要告诉玩家B他们被击中了。 我知道如何让玩家 A 告诉后端服务器他开了一枪,只是向服务器发送请求,但是如何让后端告诉玩家 他们被枪杀了? 玩家B是否必须每0.1秒检查一次后端以查看是否发生了什么事情,或者是否有更有效的方法?

  • 如何使用JAX-RS Client Fluent API为外部世界REST服务创建rest客户端? 例如,假设一个服务返回一个person对象,该对象有两个字段名和年龄。 无论我遇到什么样的例子/教程,他们做同样的事情,下面的片段或他们开发客户端在同一个项目,以取代tring.classperson.class.我应该如何创建独立的客户端,将返回我pojo的人。

  • 我正在Azure Kubernetes服务上工作。我正在通过门户成功创建AKS。但是,我需要通过ARM模板来完成。 如何使用ARM模板创建AK? 为此,我选择了link 但是,我收到的问题如下: 代码:InvalidTemplate 消息:部署模板验证失败:“模板资源”AKSsubnet/Microsoft。授权/36985XXX-XXXX-XXXX-XXXX-XXXX-5fb6b7ebXXXX“

  • 关于Netflix Eureka Service Registry,我已经成功地使用Tomcat8.0.35设置了Eureka Netflix服务器。我还得到了基本的示例服务&客户端来进行相互通信。我对Eureka还是个新手,管理层决定将Eureka与Spring一起使用,因为几个新的应用程序都是围绕Spring框架编写的。 null 我希望为大多数非AWS云实例配置服务和客户端。Eureka W

  • 我是java和web服务以及的新手。我最近使用一些教程创建了一个web服务。当我第一次学习eclipse教程时,让我创建一个客户机。但是当我尝试创建一个新项目和一个新的web服务客户机时,它会给出。具体如下所示: im使用Axis2-1.6.1,它说java遵从性级别是6,我搜索了一下,但是找不到解决这个问题的相关方案。感谢任何帮助。