文章目录

  • 前言
  • WebService是什么?
  • WebService原理?
  • HttpClient是什么?
  • HttpClient应用场景?
  • 使用HttpClient调用WebService接口
    • 1、创建HttpClient工具类
    • 2、创建一个XML转JSON格式的工具类
    • 3、创建一个类,通过HttpClient工具类连接WebService服务
    • 4、使用postman访问本地路径测试

前言

WebService是什么?

WebService即Web服务,它是一种跨编程语言和跨操作系统平台的远程调用技术。所谓跨编程语言和跨操作平台,就是说服务端程序采用Java编写,客户端程序则可以采用其他编程语言编写,反之亦然!跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运行。

WebService原理?

客户端——> 阅读WSDL文档 (根据文档生成SOAP请求) ——>通过http调用发送到Web服务器——>交给WebService请求处理器 (ISAPI Extension)——>处理SOAP请求——> 调用WebService接口——>生成SOAP应答 ——> Web服务器通过http的方式返回客户端

HttpClient是什么?

HttpClient是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议

HttpClient应用场景?

  • 项目中需要与一个基于HTTP协议的第三方的接口进行对接
  • 项目中需要动态的调用WebService服务(不生成本地源码)
  • 项目中需要利用其它网站的相关数据

使用HttpClient调用WebService接口

1、创建HttpClient工具类

import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.HttpEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class HttpClientUnit {//添加日志private static Logger logger = LoggerFactory.getLogger(HttpClientUnit.class);private final static String CONTENT_TYPE_TEXT_JSON = "text/json";public static String doPostSoap(String url, String soap, String SOAPAction) {//请求体String retStr = "";// 创建HttpClientBuilderHttpClientBuilder httpClientBuilder = HttpClientBuilder.create();// HttpClientCloseableHttpClient closeableHttpClient = httpClientBuilder.build();HttpPost httpPost = new HttpPost(url);try {httpPost.setHeader("Content-Type", "text/xml;charset=UTF-8");httpPost.setHeader("SOAPAction", SOAPAction);StringEntity data = new StringEntity(soap,Charset.forName("UTF-8"));httpPost.setEntity(data);CloseableHttpResponse response = closeableHttpClient.execute(httpPost);HttpEntity httpEntity = response.getEntity();if (httpEntity != null) {// 打印响应内容retStr = EntityUtils.toString(httpEntity, "UTF-8");System.err.println("response:" + retStr);}// 释放资源closeableHttpClient.close();} catch (Exception e) {e.printStackTrace();}return retStr;}

2、创建一个XML转JSON格式的工具类

因为HttpClient连接WebService服务的返回参数是xml类型的,而前端需要返回json类型,所有就要对结果进行转换

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.springframework.stereotype.Component;import java.util.List;/***  WebService服务工具类*  解析wsdl接口*/
@Component
public class WebServiceUnit {/*** 解析webservice的返回结果* @param xmlStr xml内容* @return*/public static JSONObject xml2Json(String xmlStr) throws DocumentException {Document doc = DocumentHelper.parseText(xmlStr);JSONObject json = new JSONObject();dom4j2Json(doc.getRootElement(), json);return json;}/*** xml转json* @param element* @param json*/public static void dom4j2Json(Element element, JSONObject json) {List<Element> chdEl = element.elements();for(Element e : chdEl){if (!e.elements().isEmpty()) {JSONObject chdjson = new JSONObject();dom4j2Json(e, chdjson);Object o = json.get(e.getName());if (o != null) {JSONArray jsona = null;if (o instanceof JSONObject) {JSONObject jsono = (JSONObject) o;json.remove(e.getName());jsona = new JSONArray();jsona.add(jsono);jsona.add(chdjson);}if (o instanceof JSONArray) {jsona = (JSONArray) o;jsona.add(chdjson);}json.put(e.getName(), jsona);} else {if (!chdjson.isEmpty()) {json.put(e.getName(), chdjson);}}} else {if (!e.getText().isEmpty()) {json.put(e.getName(), e.getText());}}}}
}

3、创建一个类,通过HttpClient工具类连接WebService服务

具体发送的参数和url在我的另一个文章里面有仔细的说明(第四步、发送xml的报文进行测试)https://blog.csdn.net/fuzhuangzhuang/article/details/113034418

@PostMapping("/GetLastDiagResultInfo")public JSONObject GetLastDiagResultInfo(@RequestBody QueryDiagResultInfoRequest request){// 向WebService发送的参数格式(xml)String strParameter = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +"<soapevn:Envelope xmlns:soapevn=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:util=\"http://util.com/\">\n" +"    <soapevn:Header/>\n" +"    <soapevn:Body>\n" +"        <util:QueryDiagResultInfo>\n" +"            <arg0>{\"pageIndex\":\""+request.getPageIndex()+"\",\"pageSize\":\""+request.getPageSize()+"\",\"type\":"+request.getType()+""</arg0>\n" +"        </util:QueryDiagResultInfo>\n" +"    </soapevn:Body>\n" +"</soapevn:Envelope>";// WebService服务的访问路径String url = "";// 向HttpClient发送请求String returnDatabase = HttpClientUnit.doPostSoap(url,strParameter,"");JSONObject jsonObject = null;try {// 将请求结果转换成json类型jsonObject = WebServiceUnit.xml2Json(returnDatabase);} catch (Exception e) {e.printStackTrace();}return jsonObject;}

4、使用postman访问本地路径测试

梦想也许在今天无法实现,但重要的是,它在你心里。重要的是,你一直在努力,加油!!!

HttpClient调用WebService接口相关推荐

  1. JAVA使用HttpClient调用webservice接口

    JAVA使用HttpClient调用webservice接口 关于HttpClient用法参考: HttpClient-4.5.2官方教程完整翻译 官方教程原文链接 HttpClient下载地址: 链 ...

  2. java调用接口速度慢,Java 调用 webservice 接口,为什么这么慢

    Java 调用 webservice 接口,为什么这么慢,有没有好的优化方案,本人目前改成 http 方式发 soap 消息调用,速度依旧很慢,维持在平均 100ms 下不来. 之前用 cxf 的 J ...

  3. 调用webservice接口,数据不回滚问题

    调用webservice接口,数据不回滚问题 使用cxf+spring框架开发webservice接口,在开发一个具有保存数据的接口功能时,如果数据发生了异常,对service层无论使用了xml配置声 ...

  4. android调用web接口,Android调用webservice 接口

    以查询手机号码归属地的Web service为例,它的wsdl为 1 在Android项目中导入??Ksoap2-android jar第三方jar包?? 2 Activity代码 public cl ...

  5. VC++使用Soap ToolKit3.0调用WebService接口

    由于项目需要,需要实现VC调用WebService接口,之前没接触过这个,所以花了一天找了点资料,并自己编写了demo. 1. 首先看了Soap相关资料,见http://www.w3school.co ...

  6. cmd 调用webservice接口_c# 三种方法调用WebService接口

    1.引用*.wsdl文件 WebService服务端会提供wsdl文件,客户端通过该文件生成.cs文件以及生成.dll. 注意:若服务端只提供的了URL,在URL后面加上"?wsdl&quo ...

  7. EJBCA 6 通过调用WebService接口增加用户并获取证书

    2019独角兽企业重金招聘Python工程师标准>>> 今天终于搞定通过调用WebService 接口的方式在EJBCA 中增加用户. 本项目完整代码请参见http://git.os ...

  8. python调用webservice接口实例_python调用各种接口,webservice,c接口,com接口,socket协议方法...

    python调用webservice接口(SOAP) (2)调用示例: 需要先安装suds库:pip install suds from suds.client import Client #如果需要 ...

  9. Java使用XFire调用WebService接口

    看了一些Java调用WebService接口的例子,很多都是Ctrl+C,Ctrl+V的,其中有很多拿来使用后发现有错误,令人郁闷,特此写了一篇经过测试的,只是一个小例子. 服务端(为客户端提供Web ...

最新文章

  1. android 实现全屏代码
  2. 移动支付交易规模增长率高达707%,安全面临考验!
  3. Bootstrap的栅格布局
  4. 《Getting Real》读书笔记
  5. iec61131 3 html5,IEC61131-3{ed3.0}标准资料.doc
  6. 网络拓扑故障诊断讲解总结
  7. 编写一个生成器需要编写__iter__和__next__
  8. 微信网页支付小白指南-域内浏览器支付 + 外部浏览器支付
  9. elasticsearch小记之—— unmapped_type的使用
  10. 平面设计需要学什么软件?平面设计软件有哪些?
  11. python 将繁体转换成简体
  12. 端午节之苍南懒人游 (*^__^*) ……
  13. 掘金「跳转外链风险提示」实现思考
  14. Ailurus 小熊猫
  15. 原神私服 grasscutter搭建及食用教程 v3.3
  16. 1016: 银行利率 Python
  17. 安装windows10操作报错:找不到签名的设备驱动程序
  18. SpringMVC基础
  19. 【python实现进制转换器】10进制整数向任意进制转换
  20. php redis 修改端口号,如何修改redis默认端口

热门文章

  1. 一个相见恨晚的学习网站,全1080P视频教学!
  2. 在vue脚手架中,学习实现一个轮播图(2-旋转木马)
  3. ubunt 上进行c++ cuda编程
  4. CTFshow-菜狗杯-Crypto-签到-Caesar-0x36d-类型7
  5. Html,js网上购物订单的制作
  6. End-to-end Learning for Inter-Vehicle Distance and Relative Velocity Estimation in ADAS with a Monoc
  7. 大数据综合项目--网站流量日志数据分析系统(详细步骤和代码)
  8. mysql里real类型_SQL中数据类型float与real的区别?
  9. 背单词学英语20年经验总结
  10. 瑞昱RTL8188cus 无线网卡驱动移植