我已经宣布了两个REST Web服务.一个简单的返回一个对象.而其他的接受一个对象并返回另一个对象.
使用POJO Order. java.
@XmlRootElement
public class Order {

   private String id;

   private String description;

   public Order() {
   }

   @XmlElement
   public String getId() {
          return id;
   }
   @XmlElement
   public String getDescription() {
          return description;
   }

    // Other setters and methods
}

Webservice被定义为

@Path("/orders")
public class OrdeRSService {
// Return the list of orders for applications with json or xml formats
@Path("/oneOrder")
@GET
@Produces({MediaType.APPLICATION_JSON})
public  Order getorder_json() {
  System.out.println("inside getorder_json");
  Order o1 = OrderDao.instance.getorderFromId("1");
  System.out.println("about to return one order");
  return o1;
}

@Path("/writeAndIncrementOrder")
@GET
@Produces({MediaType.APPLICATION_JSON})
@Consumes({MediaType.APPLICATION_JSON})
public  Order writeAndIncrementOrder(Order input) {
  System.out.println("inside writeAndIncrementOrder");
  Order o1 = new Order();
  o1.setId(input.getId()+1000);
  o1.setDescription(input.getDescription()+"10000");
  System.out.println("about to return one order");
  return o1;
 }

我可以编写客户端代码来调用不接受任何东西但返回对象的Web服务.客户端代码如下

import java.net.URI;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Invocation.Builder;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;
import org.glassfish.jersey.client.ClientConfig;

public class Test {

public static void main(String[] args) {

WebTarget target2 = client.target(getBaseURI()).path("rest").path("orders");
String o2 = target2.path("oneOrder").request().accept(MediaType.APPLICATION_JSON).get(String.class);
        System.out.println(o2);
}

private static URI getBaseURI() {
    return UriBuilder.fromUri("http://localhost:8090/FirstRESTProject").build();
  }

但我不明白如何调用接受的其他服务以及返回对象.
我在互联网上尝试了不同的解决方案但没有什么对我有用一些解决方案只适用于发送对象,一些只适用于接受.但是没有人在一个电话中做这两个工作.

编辑
如下面的建议回答我注册了JacksonJaxbJsonProvider.class但是自动转换为Order对象并没有发生.

String o2 = target2.path("oneOrder").request().accept(MediaType.APPLICATION_JSON).get(String.class);

        client.register(JacksonJaxbJsonProvider.class);
        Order o4 = target2.path("oneOrder").request().accept(MediaType.APPLICATION_JSON).get(Order.class);

在上面的程序中,我成功获取字符串为{“id”:“1”,“description”:“这是第一个命令”}但是获取直接对象抛出错误
MessageBodyReader未找到媒体类型= application / json,type = class shopping.cart.om.Order,genericType = class shopping.cart.om.Order.

解决方法

如果您花点时间了解 WebTarget API,以及从调用WebTarget方法返回的不同类型,您应该更好地了解如何拨打电话.这可能是一个有点混乱,因为几乎所有的示例使用方法链接,因为它是一个非常方便的方式,但这样做,你错过了创建和发送请求涉及的所有实际的类.让我们分解一下

WebTarget target = client.target(getBaseURI()).path("rest").path("orders");

WebTarget.path()只返回WebTarget.没有什么有趣的

target.path("oneOrder").request().accept(MediaType.APPLICATION_JSON).get(String.class)

> WebTarget.request()返回Invocation.Builder
> Invocation.Builder.accept(..)返回Invocation.Builder
> Invocation.Builder.get()调用其超级类的SyncInvoker.get(),这是实际请求,并返回一个类型,根据我们提供的参数get(Class returnType)

get(String.class)正在使用的是将响应流反序列化为Sting类型的响应.这不是问题,因为JSON本质上只是一个String.但是,如果您想将其解组成POJO,那么您需要有一个MessageBodyReader,它可以知道如何将JSON解组成您的POJO类型.杰克逊提供了一个MessageBodyReader,它的jackson-jaxrs-json-provider依赖

<dependency>
  <groupId>com.fasterxml.jackson.jaxrs</groupId>
  <artifactId>jackson-jaxrs-json-provider</artifactId>
  <version>2.4.0</version>
</dependency>

大多数实现将为此模块提供一个包装器,例如泽西的泽西媒体杰克逊或Resteasy的resteasy-jackson提供商.但是他们仍然在使用基础的jackson-jaxrs-json-provider.

话虽如此,一旦你在类路径上有这个模块,应该自动注册,所以MessageBodyReader将可用.如果不是,您可以向客户端明确注册,如client.register(JacksonJaxbJsonProvider.class).一旦你配置了杰克逊支持,那么你可以简单地做一些事情

MyPojo myPojo = client.target(..).path(...).request().accept(..).get(MyPojo.class);

对于发布/发送数据,您可以再次查看不同的Invocation.Builder方法.例如

Invocation.Builder builder = target.request();

如果我们要发布,请查看可用的不同post方法.我们可以用

> Response post(实体<?>实体) – 我们的请求可能看起来像

Response response = builder.post(Entity.json(myPojo));

你会注意到Entity.所有的post方法接受一个实体,这就是请求如何知道实体的类型应该是什么,客户端将调用相应的MessageBodyWriter以及设置相应的头
>< T> T post(Entity<?> entity,Class< T> responseType) – 还有一个重载,我们可以指定要解组的类型,而不是返回一个Response.我们可以做

MyPojo myPojo = builder.post(Entity.json(myPojo),MyPojo.class)

请注意,使用Response,我们将其readEntity(类pojoType)方法称为从实体体的响应中读取.这个优点是,Response对象带有很多有用的信息,我们可以使用,如标题等.就个人而言,我总是得到回应

Response response = builder.get();
    MyPojo pojo = response.readEntity(MyPojo.class);

除此之外,对于您显示的特定代码,您最有希望使其成为@POST方法.记住@GET主要用于检索数据,用于更新的PUT和用于创建的POST.这是一个很好的经验法则,坚持,当第一次开始.所以你可以改变方法

@Path("orders")
public class OrdersResource  {

    @POST
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes({MediaType.APPLICATION_JSON})
    public Response createOrder(@Context UriInfo uriInfo,Order input) {
       Order order = orderService.createOrder(input);
       URI uri = uriInfo.getAbsolutePathBuilder().path(order.getId()).build();
       return Response.create(uri).entity(order).build();
    }
}

然后你可以做

WebTarget target = client.target(BASE).path("orders");
Response response = target.request().accept(...).post(Entity.json(order));
Order order = response.readEntity(Order.class);

java – 接受并返回对象的REST服务.如何写客户端?的更多相关文章

  1. Html5 滚动穿透的方法

    这篇文章主要介绍了Html5 滚动穿透的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  2. HTML5 拖放(Drag 和 Drop)详解与实例代码

    本篇文章主要介绍了HTML5 拖放(Drag 和 Drop)详解与实例代码,具有一定的参考价值,有兴趣的可以了解一下

  3. 跨域修改iframe页面内容详解

    这篇文章主要介绍了跨域修改iframe页面内容详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  4. 关于h5中的fetch方法解读(小结)

    这篇文章主要介绍了关于h5中的fetch方法解读(小结),fetch身为H5中的一个新对象,他的诞生,是为了取代ajax的存在而出现,有兴趣的可以了解一下

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 使用NSURLSession获取JSON数据

    我试图从谷歌距离api使用NSURLSession获取数据,但如下所示,当我打印响应和数据时,我得到的结果为NULL.可能是什么问题?

  7. ios – 暂停调度队列是否会暂停其目标队列?

    我想创建两个串行队列A&B.队列B是队列A的目标.我想在B上排队一些块,并暂停它直到我准备执行它们,但是我想继续在队列A上执行块.如果我暂停B,这还会暂停它的目标队列(队列A)吗?我的想法是,我想安排这些特定的块在稍后日期执行但是我不希望它们同时运行而我不这样做想要处理信号量.但我希望队列A继续处理它的块,而B则被暂停如果不清楚这里是一些示例代码解决方法queueB被挂起,但queueA未被挂起.queueA和queueB被挂起.

  8. 保护MY REST API仅用于MY IOS APP

    我在Laravel中设计一个RESTAPI,用于我的ios应用程序.目前我被困在以下几点:如何保护我的RESTAPI只允许访问我的ios应用程序?听起来我需要通过向我的IOSAPP授予一个私钥来将类似于HMAC方法的内容合并到我的IOSAPP代码中.当从iosapp中运行请求时,我传递带有私钥和其他数据的哈希,然后当在服务器上收到请求时,我通过重新计算哈希来检测请求是否来自应用程序内的用户.我不知道这是否安全&我会认为不是吗?

  9. ios – 错误域= com.alamofire.error.serialization.response代码= -1011“请求失败:禁止

    任何人都可以帮我解决以下错误–>在AFNetworking2.5中使用“删除”方法时出错解决方法我发现,如果我的手机时钟不同步……它不允许我更新…也许检查你的手机设置到正确的时间“自动区”,看看是否有效…

  10. ios – 使用CocoaPods post install hook将自定义路径添加到HEADER_SEARCH_PATHS

    解决方法在Podfile中定义一个方法:然后在post_install中调用该方法:

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部