Java调用WebServices接口

news/2024/11/16 5:34:29/

当拿到一个WebServices接口时,首先用接口测试工具调用一下接口,看是否可以正常发送请求和获取返回接口,确保接口是没有问题的,可以用SoapUI工具进行测试。

下面以一个免费的天气预报接口为例,记录整个接口的调用过程。

接口地址:http://ws.webxml.com.cn/WebServices/WeatherWS.asmx

打开SoapUI,点击SOAP,在弹出的新建页面输入接口地址,在地址后面拼接上 ?wsdl ,点击OK。

会看到在左侧地方显示该接口可以调用的每个方法。

获取上海的天气信息:

点击绿色剪箭头,就可以在右侧看到接口的返回结果。

以上就是用SoapUI工具进行接口测试的使用说明。

下面用Java代码来实现该接口的调用:

新建一个测试类 WebServiceTest

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;/*** @author: liangmeng* @description: WebService测试* @date: 2024/4/14 13:42* @version: 1.0*/
public class WebServiceTest {public static void main(String[] args) {String soapRequestXml = null;String soapResponseXml = null;String responseCode = null;HashMap<String, String> responseData = new HashMap<>();//soap报文soapRequestXml = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:web=\"http://WebXml.com.cn/\">\n" +"   <soapenv:Header/>\n" +"   <soapenv:Body>\n" +"      <web:getWeather>\n" +"         <web:theCityCode>上海</web:theCityCode>\n" +"         <web:theUserID>5fc88ce5ff404ce6ba1282125f68d258</web:theUserID>\n" +"      </web:getWeather>\n" +"   </soapenv:Body>\n" +"</soapenv:Envelope>";//发送post请求responseData = postSoap("http://ws.webxml.com.cn/WebServices/WeatherWS.asmx", soapRequestXml, "http://WebXml.com.cn/getWeather");responseCode = responseData.get("responseCode");soapResponseXml = responseData.get("responseMsg");System.out.println("请求状态:"+responseCode);System.out.println("返回参数:"+soapResponseXml);}/*** @param postUrl: 请求地址* @param soapXml: 请求报文* @param soapAction: 请求方法名称* @return HashMap<String,String>* @author 梁萌* @description 发送POST请求* @date 2024/4/14 13:49*/public static HashMap<String, String> postSoap(String postUrl, String soapXml, String soapAction) {HashMap<String, String> hm = new HashMap<>();//响应结果StringBuilder result = new StringBuilder();//输出流OutputStream out = null;//字符缓冲输入流BufferedReader in = null;//状态响应码int responseCode = 0;try {//创建URLURL url = new URL(postUrl);//重要,WSDL路径,不带?wsdlURLConnection connection = url.openConnection();HttpURLConnection httpConn = (HttpURLConnection) connection;//设置参数httpConn.setRequestProperty("Content-Length", String.valueOf(soapXml.getBytes(StandardCharsets.UTF_8).length));httpConn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");httpConn.setRequestProperty("SOAPAction", soapAction); //重要,调用接口的某个方法httpConn.setRequestMethod("POST");httpConn.setDoOutput(true);httpConn.setDoInput(true);//发送请求out = httpConn.getOutputStream();out.write(soapXml.getBytes(StandardCharsets.UTF_8));//状态响应码responseCode = httpConn.getResponseCode();//状态响应码=200in = new BufferedReader(new InputStreamReader(httpConn.getInputStream(), StandardCharsets.UTF_8));String inputLine;while ((inputLine = in.readLine()) != null) {result.append(inputLine);}} catch (Exception ex) {System.out.println("soap请求路径:" + postUrl + ",异常,响应状态码:" + responseCode + ",异常原因:" + ex.getMessage());hm.put("responseCode", responseCode + "");hm.put("responseMsg", ex.getMessage() + "");return hm;} finally {try {if (out != null) {out.close();}if (in != null) {in.close();}} catch (Exception ex) {System.out.println("soap请求路径:" + postUrl + ",异常,响应状态码:" + responseCode + ",异常原因:释放资源失败");hm.put("responseCode", responseCode + "");hm.put("responseMsg", ex.getMessage() + "");return hm;}}//返回响应内容String soapResponse = result.toString();System.out.println("soap请求路径:" + postUrl + ",结束,响应状态码:" + responseCode + ",返回结果:" + soapResponse);hm.put("responseCode", responseCode + "");hm.put("responseMsg", soapResponse + "");return hm;}}

执行结果:

成功通过Java程序获取到了接口的返回信息。

代码中有几个需要注意的地方:

1.请求地址中不需要添加 ?wsdl

2.请求的方法名称(postSoap方法的第三个参数soapAction),需要与SoapUI工具中的soapAction参数值保持一致,参见下图的内容:


http://www.ppmy.cn/news/1423115.html

相关文章

Transform结构

面试者经常会问transform这个模型&#xff0c;一个典型的seq2seq结构。 1 背景 试问几个问题&#xff0c;为什么提出了transform模型。RNN对于长时间序列&#xff08;超过40&#xff09;压缩到一个上下文向量中出现记忆退化现象&#xff0c;无法更好捕捉上下文信息。因此trans…

复合机器人在磁钢上下料中的应用及其优势分析

复合机器人是一种集成了移动机器人和工业机器人功能的设备&#xff0c;其独特之处在于拥有“手、脚、眼、脑”的综合能力&#xff0c;从而实现了更高的灵活性和操作效率。在磁钢上下料的应用场景中&#xff0c;复合机器人能够发挥显著的优势。 首先&#xff0c;复合机器人可以根…

Java之JVM、JUC面试题笔记(持续更新)

CountDownLatch和CyclicBarrier JUC 并发编程_juc并发编程-CSDN博客 java 类加载机制&#xff1f;如何实现自定义类加载器&#xff1f;findClass 与 loadClass 的区别&#xff1f; 在Java中&#xff0c;自定义类加载器通常是通过继承java.lang.ClassLoader类并重写其findClas…

前端基础(之三)

Q1&#xff1a;介绍一下盒模型 A1&#xff1a;盒模型是用于描述Html在页面总所占空间的方式&#xff0c;盒模型将每个html元素视为一个矩形框&#xff0c;该框主要由四个主要部分组成&#xff1a;内容区域、内边距、边框和外边距。 内容区域是Html元素实际包含内容的部分&…

java | 多线程 | ThreadLocal

场景&#xff1a; web app中&#xff0c;每个request都会有一个Thread去处理&#xff0c;但是多个request可能对应一个资源&#xff1a;userInfo&#xff0c;常用ThreadLocal来存储userInfo。 网上搜&#xff0c;ThreadLocal的定义&#xff0c;大概就是&#xff1a;让每个线程…

FFmpeg: 自实现ijkplayer播放器--04消息队列设计

文章目录 播放器状态转换图播放器状态对应的消息&#xff1a; 消息对象消息队列消息队列api插入消息获取消息初始化消息插入消息加锁初始化消息设置消息参数消息队列初始化清空消息销毁消息启动消息队列终止消息队列删除消息 消息队列&#xff0c;用于发送&#xff0c;设置播放…

加载 docker 镜像文件 centos7 系统 lnmp 环境 php8.2 php5.2 php7.4

# 加载镜像从tar文件 链接&#xff1a;https://pan.baidu.com/s/1s2yf7iroI-tBTK5b9zxxnA 提取码&#xff1a;6666 docker load < my_migration_image.tar # 运行新容器&#xff0c;可以使用相同的参数和命令 8233 电脑访问时对应的端口 80 docker 上的nginx 端口号 …

初学python记录:力扣705. 设计哈希集合

题目&#xff1a; 不使用任何内建的哈希表库设计一个哈希集合&#xff08;HashSet&#xff09;。 实现 MyHashSet 类&#xff1a; void add(key) 向哈希集合中插入值 key 。bool contains(key) 返回哈希集合中是否存在这个值 key 。void remove(key) 将给定值 key 从哈希集合…