互联网上有很多如何使用RESTful Client API的东西。 这些是基础。 但是,尽管该主题看起来微不足道,但仍然存在一些障碍,尤其是对于初学者而言。
在这篇文章中,我将尝试总结我的专业知识,以及我如何在实际项目中做到这一点。 我通常使用Jersey(用于构建RESTful服务的参考实现)。 参见例如我的另一篇文章 。 在本文中,我将从JSF bean调用真正的远程服务。 让我们编写一个会话范围的bean RestClient。

package com.cc.metadata.jsf.controller.common;import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;/*** This class encapsulates some basic REST client API.*/
@ManagedBean
@SessionScoped
public class RestClient implements Serializable {private transient Client client;public String SERVICE_BASE_URI;@PostConstructprotected void initialize() {FacesContext fc = FacesContext.getCurrentInstance();SERVICE_BASE_URI = fc.getExternalContext().getInitParameter('metadata.serviceBaseURI');client = Client.create();}public WebResource getWebResource(String relativeUrl) {if (client == null) {initialize();}return client.resource(SERVICE_BASE_URI + relativeUrl);}public ClientResponse clientGetResponse(String relativeUrl) {WebResource webResource = client.resource(SERVICE_BASE_URI + relativeUrl);return webResource.accept('application/json').get(ClientResponse.class);}
}

在此类中,我们获得了在web.xml中指定(配置)的服务基础URI。

<context-param><param-name>metadata.serviceBaseURI</param-name><param-value>http://somehost/metadata/</param-value>
</context-param>

此外,我们编写了两种方法来接收远程资源。 我们打算接收JSON格式的资源,并将其转换为Java对象。 下一个bean演示了如何对GET请求执行此任务。 Bean HistoryBean通过使用GsonConverter将接收到的JSON转换为Document对象。 最后两节将不在此处显示(没关系)。 Document是一个简单的POJO,而GsonConverter是一个包装Gson的单例实例。

package com.cc.metadata.jsf.controller.history;import com.cc.metadata.jsf.controller.common.RestClient;
import com.cc.metadata.jsf.util.GsonConverter;
import com.cc.metadata.model.Document;import com.sun.jersey.api.client.ClientResponse;import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;/*** Bean getting history of the last extracted documents.*/
@ManagedBean
@ViewScoped
public class HistoryBean implements Serializable {@ManagedProperty(value = '#{restClient}')private RestClient restClient;private List<Document> documents;private String jsonHistory;public List<Document> getDocuments() {if (documents != null) {return documents;}ClientResponse response = restClient.clientGetResponse('history');if (response.getStatus() != 200) {throw new RuntimeException('Failed service call: HTTP error code : ' + response.getStatus());}// get history as JSONjsonHistory = response.getEntity(String.class);// convert to Java array / list of Document instancesDocument[] docs = GsonConverter.getGson().fromJson(jsonHistory, Document[].class);documents = Arrays.asList(docs);return documents;}// getter / setter...
}

下一个bean演示了如何通过POST与远程服务进行通信。 我们打算发送上传文件的内容。 我使用PrimeFaces的 FileUpload组件,以便可以从侦听器的参数FileUploadEvent中提取内容作为InputStream。 这在这里并不重要,您还可以使用任何其他Web框架来获取文件内容(也可以作为字节数组)。 更重要的是,看看如何处理RESTful Client类FormDataMultiPart和FormDataBodyPart。

package com.cc.metadata.jsf.controller.extract;import com.cc.metadata.jsf.controller.common.RestClient;
import com.cc.metadata.jsf.util.GsonConverter;
import com.cc.metadata.model.Document;import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.core.header.FormDataContentDisposition;
import com.sun.jersey.multipart.FormDataBodyPart;
import com.sun.jersey.multipart.FormDataMultiPart;import org.primefaces.event.FileUploadEvent;import java.io.IOException;
import java.io.Serializable;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;import javax.ws.rs.core.MediaType;/*** Bean for extracting document properties (metadata).*/
@ManagedBean
@ViewScoped
public class ExtractBean implements Serializable {@ManagedProperty(value = '#{restClient}')private RestClient restClient;private String path;public void handleFileUpload(FileUploadEvent event) throws IOException {String fileName = event.getFile().getFileName();FormDataMultiPart fdmp = new FormDataMultiPart();FormDataBodyPart fdbp = new FormDataBodyPart(FormDataContentDisposition.name('file').fileName(fileName).build(),event.getFile().getInputstream(), MediaType.APPLICATION_OCTET_STREAM_TYPE);fdmp.bodyPart(fdbp);WebResource resource = restClient.getWebResource('extract');ClientResponse response = resource.accept('application/json').type(MediaType.MULTIPART_FORM_DATA).post(ClientResponse.class, fdmp);if (response.getStatus() != 200) {throw new RuntimeException('Failed service call: HTTP error code : ' + response.getStatus());}// get extracted document as JSONString jsonExtract = response.getEntity(String.class);// convert to Document instanceDocument doc = GsonConverter.getGson().fromJson(jsonExtract, Document.class);...}// getter / setter...
}

最后但并非最不重要的一点,我想演示如何使用任何查询字符串(URL参数)发送GET请求。 下一个方法通过看起来像http:// somehost / metadata / extract?file = <some file path>的URL询问远程服务。

public void extractFile() {WebResource resource = restClient.getWebResource('extract');ClientResponse response = resource.queryParam('file', path).accept('application/json').get(ClientResponse.class);if (response.getStatus() != 200) {throw new RuntimeException('Failed service call: HTTP error code : ' + response.getStatus());}// get extracted document as JSONString jsonExtract = response.getEntity(String.class);// convert to Document instanceDocument doc = GsonConverter.getGson().fromJson(jsonExtract, Document.class);...
}

参考:在我们的软件开发博客上,来自我们JCG合作伙伴 Oleg Varaksin的RESTful Client API进行GET / POST 。

翻译自: https://www.javacodegeeks.com/2013/01/get-post-with-restful-client-api.html

使用RESTful客户端API进行GET / POST相关推荐

  1. 如何实现RESTful Web API的身份验证

    最近想拿一个小项目来试水RESTful Web API,项目只有几个调用,比较简单,但同样需要身份验证,如果是传统的网站的话,那不用说,肯定是用户名+密码在登录页获得登录Token,并把登录Token ...

  2. 通过 Jersey Http请求头,Http响应头,客户端 API 调用 REST 风格的 Web 服务

    原地址:http://blog.csdn.net/li575098618/article/details/47853263 Jersey 1.0 是一个开源的.可以用于生产环境的 JAX-RS(RES ...

  3. 我所理解的RESTful Web API [设计篇]

    <我所理解的RESTful Web API [Web标准篇]>Web服务已经成为了异质系统之间的互联与集成的主要手段,在过去一段不短的时间里,Web服务几乎清一水地采用SOAP来构建.构建 ...

  4. django restful 请求_利用 Django REST framework 构建 RESTful Web API

    利用 Django REST framework 构建 RESTful Web API 终于到了动手操作的环节啦,这一节,我们以师生管理系统为例,带领大家搭建一套 framework Web API. ...

  5. 声明式RESTful客户端在asp.net core中的应用

    1 声明式RESTful客户端 声明式服务调用的客户端,常见有安卓的Retrofit.SpringCloud的Feign等,.net有Refit和WebApiClient,这些客户端都是以java或. ...

  6. 使用RESTful Client API进行GET / POST

    互联网上有很多如何使用RESTful Client API的东西. 这些是基础. 但是,尽管该主题看起来微不足道,但仍然存在一些障碍,尤其是对于初学者而言. 在这篇文章中,我将尝试总结我的专业知识,以 ...

  7. 【转载】Elasticsearch客户端API使用Demo

    Elasticsearch客户端API使用Demo, 转载自官方文档, 以索引雇员文档为示例, 在命令行使用curl演示了一系列的Restful API操作. 1.索引雇员文档 第一个业务需求就是存储 ...

  8. 生成用于ASP.NET Web API的C#客户端API

    目录 介绍 主要特征 主要好处 背景 推定(Presumptions) 使用代码 步骤0:将NuGet软件包WebApiClientGen安装到Web MVC/API项目 步骤1:建立.NET Cli ...

  9. 生成用于ASP.NET Web API的TypeScript客户端API

    目录 介绍 备注 背景 推定(Presumptions) 使用代码 步骤0:将NuGet package WebApiClientGen和WebApiClientGen.jQuery安装到Web AP ...

最新文章

  1. 协程Coroutines入门
  2. pomelo php,Nginx 502 Bad Gateway 自动重启shell脚本
  3. ANDROID L日志系统——JAVAAPI与LIBLOG
  4. LiveVideoStackCon深圳-网络的研究够搞个几辈子
  5. 北大计算机系统结构学硕,转自包云刚,希望的原野 最近几个月参加了计算所、北大、上海交大多位计算机系统结构硕士与博士的答辩,说几点体会: ① 高水平国际论文越来越多。简单... - 雪球...
  6. api函数原型大全_如何使用您的API优先平台来使原型做好生产准备
  7. 2018,广东,深圳马峦山游玩攻略(含登山线路)
  8. audio-音频标签
  9. 人力资源分析测试工具软件,HR常用的3大人才测评工具,你会用几个?
  10. 微信小程序图片上传功能(PHP后端)
  11. 明日书苑:《九成宫醴泉铭》单字放大米字格临帖字帖
  12. AppCan:打造成云生态的移动PaaS平台
  13. 8 Babylonjs基础入门 相机,模型碰撞和重力效果
  14. python操作剪贴板
  15. 汇编指令学习(AND,OR,XOR,NOT)
  16. 微软出手,干翻 IDEA?网友:先干翻 Eclipse 吧
  17. 大众创业热度不减,好机友项目强势来袭
  18. 2022年天津最新建筑八大员(电气)模拟考试题库及答案
  19. Day 15-其它 Composition API_ 响应式数据的判断
  20. java实现七巧板问题_[Java教程]canvas,绘制七巧板

热门文章

  1. redis存opc_KEPServerEX6完整免费版
  2. SpringBoot多数据源(主从数据源)配置
  3. apache ignite_Kubernetes集群上的Apache Ignite和Spring第2部分:Kubernetes部署
  4. java序列化和反序列化_Java恶意序列化背后的历史和动机
  5. aws 性能_AWS上的应用程序自动扩展–选项和对性能的影响
  6. layui绑定json_认识定制:JSON绑定概述系列
  7. azure blob_使用Azure Blob存储托管Maven工件
  8. aws sqs_AWS SQS和Spring JMS集成
  9. java jpa 异步编程_异步处理时的JPA
  10. 通过Spring集成进行消息处理