背景

近期,由于项目的要求需要在自己的webservice中调用远程的WebAPI(Restful format)。自己的webservice程序是用Java编码写的,所以需要在其中实现一个Client来调用远程的Restful接口。

选型

其实在自己的项目里面也有类似的调用,当时使用的是“JAXRSClientFactory”获得静态代理client。 由于这种方式需要依赖于远程调用的webservice接口(需要引入别人的jar包)。这就造成了高耦合。因此不适用。

所以需要以一种低耦合的方式来实现。便有了选型的想法。

在网上搜索一番后,基本定型为两种方式:

1.HttpClient

2.RestTemplate

接下来就分别列出两种方式的实现代码

HttpClient

import java.io.IOException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit; import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class HttpClientUtil { private static final Logger log = LoggerFactory.getLogger(HttpClientUtil.class);
private CloseableHttpClient httpClient = HttpClients.createDefault(); public static String executePost(String url, String tdfBase64) throws Exception { String result = null;
HttpPost httpPost = new HttpPost(url); httpPost.setEntity(new HttpEntity<String>(tdfBase64)); HttpResponse response = httpClient.execute(httpPost);
if (response != null) {
HttpEntity resEntity = response.getEntity();
if (resEntity != null) {
result = EntityUtils.toString(resEntity, "utf-8");
}
} return result;
}
} public static void main(String[] args) {
// TODO Auto-generated method stub
String url = "http://169.8.160.201:8080/xx/Webservice/Submit";
String base64Tdf = "MS4wMToxMzIdMS4wMjowMjAxHTEuMDM6MR8wMR4yHzAwHTEuMDQ6SVJRHTEuMDU6MjAxNjA1MDQdMS4wNjoxHTEuMDc6Q09HRU5UHTEuMDg6VEhBSUxBTkQdMS4wOTpTRVFVRU5DRU5PMTIzNB0xLjExOjE5LjY5HTEuMTI6MTkuNjkcMi4wMDE6MzEdMi4wMDI6MDAdMi4xNzY6MDA3MDA5HA==";
HttpClientUtil client = new HttpClientUtil();
String result=client.executePost(url, base64Tdf, "");
System.out.println(result);
}

RestTemplate

package com.biolive.client;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpEntity;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate; public class RestTemplateClient { private static final Logger log = LoggerFactory.getLogger(RestTemplateClient.class);
private static final int connectTimeout= 5000;
private static final int readTimeOut=5000;
private RestTemplate restTemplate; public RestTemplateClient(){
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setConnectTimeout(connectTimeout);
requestFactory.setReadTimeout(readTimeOut); restTemplate = new RestTemplate(requestFactory);
} public String executePost(String url, String base64Tdf){
String result = null; HttpEntity<String>request = new HttpEntity<String>(base64Tdf);
try{
result=restTemplate.postForObject(url, request, String.class);
}catch(RestClientException ex){
ex.printStackTrace();
log.info("call post interface error: " + ex.getMessage());
} return result;
} public static void main(String[] args) {
// TODO Auto-generated method stub
String url = "http://169.8.160.201:8080/xx/Webservice/Submit";
String base64Tdf = "MS4wMToxMzIdMS4wMjowMjAxHTEuMDM6MR8wMR4yHzAwHTEuMDQ6SVJRHTEuMDU6MjAxNjA1MDQdMS4wNjoxHTEuMDc6Q09HRU5UHTEuMDg6VEhBSUxBTkQdMS4wOTpTRVFVRU5DRU5PMTIzNB0xLjExOjE5LjY5HTEuMTI6MTkuNjkcMi4wMDE6MzEdMi4wMDI6MDAdMi4xNzY6MDA3MDA5HA==";
RestTemplateClient client = new RestTemplateClient();
String result=client.executePost(url, base64Tdf);
System.out.println(result);
} }

总结

首先,用两种方法都可以在只知道url和方法类型(GET/POST/PUT/UPDATE)的情况下完成任务,调用的方式也非常类似。

RestTemplate是Spring官方封装和推荐的client, 它优化了一些底层操作,使得我们可以更简单的使用。此外,也可以根据自己的需要和Spring进行结合以及配置。

附录

RestTemplate的使用

RestTemplate有两个构造方法,分别是:

public RestTemplate() {
/**
...初始化过程
*/
} public RestTemplate(ClientHttpRequestFactory requestFactory) {
this();
setRequestFactory(requestFactory);
}

其中,第二个构造方法中可以传入ClientHttpRequestFactory参数,第一个进行默认初始化,因为我们经常需要对请求超时进行设置并能够对超时进行后续处理,而第一个构造方法,我们无法控制超时时间,第二个构造中的ClientHttpRequestFactory接口的实现类中存在timeout属性,因此选用第二个构造方法。
在spring配置文件中进行如下配置:

<!-- 配置RestTemplate -->
<!--Http client Factory-->
<bean id="httpClientFactory" class="org.springframework.http.client.SimpleClientHttpRequestFactory">
<property name="connectTimeout" value="${connectTimeout}"/>
<property name="readTimeout" value="${readTimeout}"/>
</bean> <!--RestTemplate-->
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
<constructor-arg ref="httpClientFactory"/>
</bean>

当然也可以直接使用:

        SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setConnectTimeout(1000);
requestFactory.setReadTimeout(1000); RestTemplate restTemplate = new RestTemplate(requestFactory);

注意:ClientHttpRequestFactory 接口有4个实现类,分别是:

  • AbstractClientHttpRequestFactoryWrapper 用来装配其他request factory的抽象类。
  • CommonsClientHttpRequestFactory 允许用户配置带有认证和http连接池的httpclient,已废弃,推荐用HttpComponentsClientHttpRequestFactory。
  • HttpComponentsClientHttpRequestFactory 同2.
  • SimpleClientHttpRequestFactory 接口的一个简单实现,可配置proxy,connectTimeout,readTimeout等参数

参考

http://www.cnblogs.com/softidea/p/5977375.html

http://blog.csdn.net/zpf336/article/details/73480810

Java - 在WebService中使用Client调用三方的RestAPI的更多相关文章

  1. java 实现WebService 以及不同的调用方式

    webservice:    就是应用程序之间跨语言的调用    wwww.webxml.com.cn    1.xml    2.    wsdl: webservice description l ...

  2. Java字节码中的方法调用

    invokestatic,用于static修饰的方法.任何时候调用的时候只需要类名+方法名即可,无需new.JVM直接将其映射到方法区,执行速度极快.当该方法需要参数的时候,invokestatic会 ...

  3. java 解析webservice 中的soapheader

    //从MessageContet中获取头域中的值 public HeaderBean getBeanFromRequest(org.apache.axis2.context.MessageContex ...

  4. java实现WebService 以及客户端不同的调用方式

    java 实现WebService 以及不同的调用方式 webservice:    就是应用程序之间跨语言的调用    wwww.webxml.com.cn    1.xml    2.    ws ...

  5. [z] .net与java建立WebService再互相调用

    http://blog.csdn.net/yenange/article/details/5824967 : .net建立WebService,在Java中调用. 1.在vs中新建web 简单修改一下 ...

  6. [置顶] Java WebService接口生成和调用 图文详解

    webservice简介: Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范实施的应用之间 ...

  7. Java WebService接口生成和调用 图文详解>【转】【待调整】

    webservice简介: Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范实施的应用之间 ...

  8. .net与java建立WebService再互相调用

    A: .net建立WebService,在java中调用. 1.在vs中新建web 简单修改一下Service.cs的[WebMethod]代码: using System; using System ...

  9. php中创建和调用webservice接口示例

    php中创建和调用webservice接口示例   这篇文章主要介绍了php中创建和调用webservice接口示例,包括webservice基本知识.webservice服务端例子.webservi ...

随机推荐

  1. root用户不能修改iptable文件

    问题: 需要放通IP 端口  执行: vi /etc/sysconfig/iptables, 添加完成后,wq保存,提示文件只读无法保存!!! 解决步骤: 1.查看文件权限  ls -ld /etc/ ...

  2. js实现超出一定字数隐藏并用省略号"..."代替,点击后又可进行展开和收起,

    原理简单阐述:放两个一模一样的div,把你要展示的文字放进去.页面初始化的时候,第一个div展示,第二个 div隐藏,就是这么简单.(ps:可以直接复制代码到你自己项目中,查看效果) 样式部分(记得引 ...

  3. 刨根究底字符编码之八——Unicode编码方案概述

    Unicode编码方案概述   1. 前面讲过,随着计算机发展到世界各地,于是各个国家和地区各自为政,搞出了很多既兼容ASCII但又互相不兼容的各种编码方案.这样一来同一个二进制编码就有可能被解释成不 ...

  4. 修改es最大返回结果数

    curl -XPUT http://114.215.171.188:9200/logstash-serverlog/_settings -d '{"index":{"ma ...

  5. python_day5--->递归函数,二分法查找

    li = [1, 5, 6, 7, 12, 22, 33, 44, 55, 66, 77, 88, 99, 111, 222, 333]def er(num,li): if len(li) ==0: ...

  6. Python 关于字符串处理技巧

    1.使用多个字符或字符串作为分隔符分割字符串 str.split()方法只能制定单个字符或字符串作为分割符, re.split()方法可以用正则表达式作为分割符, re.split()跟str.spl ...

  7. EF通用数据层封装类(支持读写分离,一主多从)

    浅谈orm 记得四年前在学校第一次接触到 Ling to Sql,那时候瞬间发现不用手写sql语句是多么的方便,后面慢慢的接触了许多orm框架,像 EF,Dapper,Hibernate,Servic ...

  8. 30多个Android 开发者工具 带你开发带你飞

    文中部分工具是收费的,但是绝大多数都是免费的. FlowUp 这是一个帮助你跟踪app整体性能的工具,深入分析关键的性能数据如FPS, 内存, CPU, 磁盘, 等等.FlowUp根据用户数量收费. ...

  9. HTMLCollection 对象详解,以及为什么循环获取的dom合集操作可能会出现下标不正确的情况?

    有时候循环dom合集,然后操作其中的某些dom之后,发现下标不正确了 比如我们要删除一个dom合集的时候: var selectDom = document.getElementsByClassNam ...

  10. 搭建arm交叉工具链

    1.将arm-linux-gcc-4.4.3压缩包,拷到home/armtoolchain下,进行压缩. 2.压缩命令:tar -xzvf arm-linux-gcc-4.4.3.tgz,解压后得到了 ...