互联网上有很多如何使用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客户端类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 Client API进行GET / POST相关推荐

  1. 使用RESTful客户端API进行GET / POST

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

  2. Spring RESTFul Client – RestTemplate Example--转载

    原文地址:http://howtodoinjava.com/2015/02/20/spring-restful-client-resttemplate-example/ After learning ...

  3. ecshop /api/client/api.php、/api/client/includes/lib_api.php SQL Injection Vul

    catalog 1. 漏洞描述 2. 漏洞触发条件 3. 漏洞影响范围 4. 漏洞代码分析 5. 防御方法 6. 攻防思考 1. 漏洞描述 ECShop存在一个盲注漏洞,问题存在于/api/clien ...

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

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

  5. Java 9 揭秘(14. HTTP/2 Client API)

    Tips 做一个终身学习的人. 在此章中,主要介绍以下内容: 什么是HTTP/2 Client API 如何创建HTTP客户端 如何使HTTP请求 如何接收HTTP响应 如何创建WebSocket的e ...

  6. mq 接口 java_Rabbitmq Java Client Api详解

    AMQP AMQP协议是一个高级抽象层消息通信协议,RabbitMQ是AMQP协议的实现. 基础概念快速入门 每个rabbitmq-server叫做一个Broker,等着tcp连接进入. 在rabbi ...

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

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

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

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

  9. 对RESTful Web API的理解与设计思路

    距离上一篇关于Web API的文章(如何实现RESTful Web API的身份验证)有好些时间了,在那篇文章中提到的方法是非常简单而有效的,我在实际的项目中就这么用了,代码经过一段时间的磨合,已经很 ...

最新文章

  1. python之函数三装饰器
  2. 英文论文-word summary
  3. Linux之ln命令
  4. hdu 4309(最大流+枚举状态)
  5. mybatis学习笔记(3)—数据库和bean名称不一样处理方案
  6. 一张图看懂小程序全生态
  7. npm ERR! the command again as root/Administrator
  8. html5新加入的内容,10个html5增加的重要新特性和内容
  9. 朱松纯:三读《赤壁赋》,从人工智能的角度解读“心”与“理”的平衡
  10. log4j错误log4j:WARN No appenders could be found for logger
  11. 利用华为ENSP模拟器分析和配置中小型企业网络的综合实验(下)
  12. vi 编辑器使用错误
  13. NOI-Linux使用技巧
  14. 聊聊前端框架——尤雨溪
  15. 腾讯秀丽江山之长歌行服务器维护,37秀丽江山之长歌行服务器正式关服公告
  16. 智能网联汽车信息安全研究报告
  17. 【贪心】(雾)小Y的炮
  18. 练习题:千克转换成磅
  19. 云服务器 网络端口,云服务器的端口号怎么看
  20. Win Server2003常见问题及解决然方案(转)

热门文章

  1. JavaFX UI控件教程(二十三)之Menu
  2. C++描述杭电OJ 2019. 数列有序 ||
  3. 老师 累了,我们 泪了!
  4. 重写(override / overwrite)
  5. 单例模式——Java
  6. Restlet Client 安装 网盘里面有压缩文件夹下载引用即可 谷歌浏览器
  7. 正则表达式总结之查找
  8. MySQL优化(一):表结构优化
  9. 单元测试junit参数_使用Junit参数在更少的时间内编写更好的单元测试
  10. netbeans调试_从NetBeans运行和调试WildFly Swarm应用程序