当拿到一个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参数值保持一致,参见下图的内容: