c# rest服务端程序_从Java应用程序消费REST服务

c# rest服务端程序

尽管在过去的几年中,使用REST服务确实很流行。 它们通常充当第三方解决方案(如移动应用程序)的“公共API”,或充当客户端Web应用程序(GWT,Angular等)的“持久层”。 Java可能是提供REST服务的最常见平台,但是一些Java应用程序也需要使用它们。 而且,甚至REST服务可能会使用其他REST服务来提供其数据。

在我们Java开发人员中,典型的错误是独自完成所有操作。 手动执行此操作的典型方法是执行URL.openStream() ,将响应读入字符串,然后手动解析该字符串中的数据。 即使使用核心JDK库,这也是完全可能且非常容易的-但是有很多更好的方法可以做到这一点。

Java生态系统具有许多出色的库,许多真正精心设计的标准,甚至常常有多个相互竞争的实现。 JAX-RS是其中之一,也是Java EE开发人员中众所周知的提供REST服务的一种。 但是该规范还包含使用REST服务的鲜为人知的API。 使用它可以使您的代码更快,更容易编写和维护。

还请参见: 如何将数据导出到REST

我的示例应用程序是一个小型Java EE应用程序,该应用程序将来自openweathermap.org的天气预报收集到简单的POJO中,并使用非常简单的Vaadin UI在浏览器中显示它们。 本教程的真正内容绝不是Java EE甚至Vaadin所特有的,但是它们将使我们避免大量样板代码来关注基本内容。

尽管JAX-RS是Java EE规范的一部分,但它不依赖Java EE中的其他规范。 因此,如果您的Java应用程序未在Java EE容器中运行,则只需加入JAX-RS实现( 例如Jersey),然后配置一个对象映射库即可使用它,并使示例适应您的需求。 如果碰巧使用的是基于Spring的堆栈,则可能需要研究RestTemplate API ,它与JAX-RS客户端的功能几乎相同。

该过程可以分为三个步骤:

  1. 模型
  2. 处理
  3. 消耗

步骤1:建立资料模型

通常,您的服务以XML或JSON格式提供其数据。 除非响应确实很简单(例如,字符串列表),否则通常不会通过直接访问它们来节省时间。 虽然可以使用低级API或基于地图的JSON表示形式,但这样做并不能真正提高代码的可读性。 有时,您有可能会接触到它们在提供端使用的原始Java模型,但是从XML和JSON进行反向工程POJO既快速又非常简单。

较小的模型可以立即进行手动逆向工程,但是在此步骤中,工具可以大大提高您的生产率。 为了生成此示例的完整模型 ,我使用了出色的在线服务www.jsonschema2pojo.org 。 我所做的只是从服务中复制了一个示例JSON响应,根据我的需要调整了复选框,并将生成的工件复制到了我的项目中。 我不需要对象映射库的任何注释或其他提示。 在许多情况下,如果使用精心设计的数据,则正确的命名约定就足够了。 该服务使用的基础工具也可以在本地使用

步骤2:取得资料

JAX-RS客户端API的实际用法非常简单。 仍然,我将该部分包装到服务类中以将其与实际的UI代码分开。 您的UI代码不需要知道它是在访问REST服务,Web服务还是数据库。 公共API仅显示实际UI代码的反向工程WeatherResponse类。

还请参见: 使用Spring Data REST和Java 8构建安全的REST API

JAX-RS客户端API的用法主要发生在ClientWebTarget对象周围。 Client对象是实际处理所有通信的事物。 尽管它们并不是特别繁重,但我建议每个服务类仅创建一个实例,因为建议使用最少数量的实例。 在本例中,客户端不需要特殊配置,因此我们只需从ClientBuilder获取具有默认设置的实例。

private Client client;
private WebTarget target;
private Client client;
private WebTarget target;

@PostConstruct
protected void init() {
    client = ClientBuilder.newClient();
    //query params: ?q=Turku&cnt=10&mode=json&units=metric
    target = client.target("http://api.openweathermap.org/data/2.5/forecast/daily")
       .queryParam("cnt", "10")
       .queryParam("mode", "json")
       .queryParam("units", "metric");
}

WebTarget是不可变的对象,它们对正在访问的服务中的特定URI进行建模。 在init方法中,您可以看到如何使用fluent API彼此堆叠“静态”参数并将中间目标另存为字段。 在业务方法中,我们只需要附加动态参数并执行实际请求即可。

public ForecastResponse getForecast(String place) {
    return target.queryParam("q", place)
            .request(MediaType.APPLICATION_JSON)
            .get(ForecastResponse.class);
}

在request方法中,您可以显式请求特定的答案类型,在这种情况下该方法已经过时了,因为我们已经将其作为服务特定的参数给出了。 实际的GET请求是使用类似命名的方法完成的。 此时,是时候利用我们在步骤1中进行了逆向工程的数据模型了。我们可以通过传递响应模型类作为参数,而不是手动检查Response对象。

在幕后,使用对象映射库(例如Jackson)将原始JSON(在这种情况下)自动转换为反向工程域模型。 如果在Java SE运行时中使用API​​,请确保将对象映射库与JAX-RS API一起配置。 请注意,特殊类型GenericType可以在某些情况下使用,以避免对工程简单类型进行反向工程,例如字符串列表或域特定类型的列表。

自然也支持其他HTTP方法(例如POST和PUT),并且您可以使用相同的自动POJO映射来提交有效负载,但方向相反。 只需使用其静态工厂方法将有效负载包装到Entity中即可

步骤3:使用数据

将POJO与几乎所有Java技术一起使用都是非常基本的东西,因此我将不介绍该部分。 为了将示例作为可运行的应用程序完成,我将服务挂接到了Vaadin UI中。 在VaadinUI中,您可以选择三个预定义的城市,然后ForecastDisplay在每日天气预报中循环显示,并以人类可读的形式显示数据。

现在,您应该了解使用JAX-RS客户端API的基础知识。 您可以在JavaDocs或特定于实现的手册中找到更多详细信息。 使这个舒适的助手变得更加轻松的一种简单方法是,将我的示例项目检入您最喜欢的IDE中并开始黑客攻击!

此处获取完整的示例代码

翻译自: https://jaxenter.com/consuming-rest-services-java-applications-113185.html

c# rest服务端程序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值