0


Idea调用WebService

Idea调用WebService

​ WebService是一种基于网络的技术,它允许不同的应用程序在互联网上相互通信。要进行WebService对接,以下是一些关键步骤和注意事项:

一、理解WebService的基本概念

  • 定义:WebService是一种基于标准化协议和格式的应用程序接口(API),它使用XML和HTTP来进行通信。
  • 特点:可以跨平台、跨语言进行数据传输和应用程序集成。

二、获取WSDL文件

三、阅读和理解WSDL文件

  • 服务定义:WSDL文件包含一个或多个服务定义,每个服务定义描述了一个或多个相关的操作,以及它们接受和返回的消息的格式。
  • 命名空间:WSDL中的命名空间用于唯一标识WSDL中包含的类型、元素和消息。
  • 操作和方法:WSDL文件还描述了Web服务的地址、协议和传输机制等信息,以及具体的操作和方法。

四、选择对接测试工具或方式

  • SOAP UI:一个流行的WebService测试工具,可以用于查看WebService的接口信息、发送请求和接收响应。
  • Postman:另一个常用的API测试工具,同样可以用于WebService的对接测试。
  • 编程方式:在代码中,可以通过发送HTTP请求来调用WebService,请求参数需要按照WSDL文件中定义的格式封装成XML格式。

五、发送请求和接收响应

  • 请求格式:根据WSDL文件中的定义,构造符合要求的SOAP请求报文。请求报文通常包含Envelope(信封)、Header(头部)和Body(正文)等部分。
  • 发送请求:使用选择的对接工具或方式发送请求到WebService的服务端点。
  • 接收响应:服务端点接收到请求后,会进行解析并调用相应的Web服务方法,然后将结果封装成HTTP响应返回。响应报文同样遵循SOAP协议,并包含Envelope、Header和Body等部分。

六、直接通过xml和http请求访问

​ 1. 引用包

<!--
             使用apache的httpclient发送http,需要引入httpclient依赖;
             使用OMElement需要引入axis2-transport-http依赖;改以来本身带有httpclient依赖,所以
                 我们不在需要单独引入httpclient依赖了
         --><dependency><groupId>org.apache.axis2</groupId><artifactId>axis2-transport-http</artifactId><version>1.7.8</version></dependency>

​ 2.

packagecom.smart.util;importorg.apache.axiom.om.OMElement;importorg.apache.axiom.om.OMXMLBuilderFactory;importorg.apache.http.client.ClientProtocolException;importorg.apache.http.client.methods.CloseableHttpResponse;importorg.apache.http.client.methods.HttpPost;importorg.apache.http.entity.StringEntity;importorg.apache.http.impl.client.CloseableHttpClient;importorg.apache.http.impl.client.HttpClientBuilder;importorg.apache.http.util.EntityUtils;importorg.junit.runner.RunWith;importorg.springframework.boot.test.context.SpringBootTest;importorg.springframework.http.HttpHeaders;importorg.springframework.http.converter.HttpMessageConverter;importorg.springframework.http.converter.StringHttpMessageConverter;importorg.springframework.test.context.junit4.SpringRunner;importorg.springframework.web.client.RestTemplate;importorg.w3c.dom.Document;importorg.w3c.dom.Element;importorg.w3c.dom.Node;importorg.w3c.dom.NodeList;importorg.xml.sax.InputSource;importorg.xml.sax.SAXException;importjavax.xml.parsers.DocumentBuilder;importjavax.xml.parsers.DocumentBuilderFactory;importjavax.xml.parsers.ParserConfigurationException;importjavax.xml.stream.XMLStreamException;importjavax.xml.xpath.XPath;importjavax.xml.xpath.XPathExpressionException;importjavax.xml.xpath.XPathFactory;importjava.io.ByteArrayInputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.StringReader;importjava.nio.charset.StandardCharsets;importjava.util.List;@RunWith(SpringRunner.class)@SpringBootTestpublicclassAbcAxis2DemoApplicationUtils{publicstaticStringdoPost(String partNo)throwsIOException{// webservice的wsdl地址finalString wsdlURL =""// 设置编码。(因为是直接传的xml,所以我们设置为text/xml;charset=utf8)finalString contentType ="text/xml;charset=utf8";/// 拼接要传递的xml数据(注意:此xml数据的模板我们根据wsdlURL从SoapUI中获得,只需要修改对应的变量值即可)StringBuffer xMLcontent =newStringBuffer("");
        xMLcontent.append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:urn=\"urn:DefaultNamespace\">\n");
        xMLcontent.append("   <soapenv:Header/>\n");
        xMLcontent.append("   <soapenv:Body>\n");
        xMLcontent.append("     <urn:字段1>Shanghai</urn:字段1>\n");
        xMLcontent.append("     <urn:字段2>"+"TAN2921"+"</urn:字段2>\n");
        xMLcontent.append("   </soapenv:Body>\n");
        xMLcontent.append("</soapenv:Envelope>");// 调用工具类方法发送http请求String responseXML =HttpSendUtil.doHttpPostByHttpClient(wsdlURL, contentType, xMLcontent.toString());// 当然我们也可以调用这个工具类方法发送http请求// String responseXML = HttpSendUtil.doHttpPostByRestTemplate(wsdlURL, contentType, xMLcontent.toString());// 利用axis2的OMElement,将xml数据转换为OMElementOMElement omElement =OMXMLBuilderFactory.createOMBuilder(newByteArrayInputStream(responseXML.getBytes()),"utf-8").getDocumentElement();try{DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();
            factory.setNamespaceAware(true);// 设置为true以处理命名空间DocumentBuilder builder = factory.newDocumentBuilder();InputSource inputSource =newInputSource(newStringReader(responseXML));Document document = builder.parse(inputSource);// 获取所有名为"OUTPUT_SHIPTOPARTYReturn"的元素,并考虑命名空间NodeList nodeList = document.getElementsByTagNameNS("urn:DefaultNamespace","OUTPUT_SHIPTOPARTYReturn");for(int i =0; i < nodeList.getLength(); i++){Element element =(Element) nodeList.item(i);// 检查元素是否有文本内容(即非空且非自闭合标签)if(element.hasChildNodes()&& element.getFirstChild().getNodeType()==Node.TEXT_NODE){String textContent = element.getTextContent();System.out.println("Extracted value: "+ textContent);return textContent;}}}catch(ParserConfigurationException|SAXException|IOException e){
            e.printStackTrace();}returnnull;}publicstaticStringgetNodeValue(Document document,String nodePaht){XPathFactory xpfactory =XPathFactory.newInstance();XPath path = xpfactory.newXPath();String servInitrBrch ="";try{
            servInitrBrch = path.evaluate(nodePaht, document);}catch(XPathExpressionException e){
            e.printStackTrace();}return servInitrBrch;}publicstaticDocumentStringTOXml(String str){StringBuilder sXML =newStringBuilder();
        sXML.append(str);DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();Document doc =null;try{InputStream is =newByteArrayInputStream(sXML.toString().getBytes("utf-8"));
            doc = dbf.newDocumentBuilder().parse(is);
            is.close();}catch(Exception e){
            e.printStackTrace();}return doc;}}/**
 * HTTP工具类
 *
 * @author JustryDeng
 * @DATE 2018年9月22日 下午10:29:08
 */classHttpSendUtil{/**
     * 使用apache的HttpClient发送http
     *
     * @param wsdlURL
     *            请求URL
     * @param contentType
     *            如:application/json;charset=utf8
     * @param content
     *            数据内容
     * @DATE 2018年9月22日 下午10:29:17
     */staticStringdoHttpPostByHttpClient(finalString wsdlURL,finalString contentType,finalString content)throwsClientProtocolException,IOException{// 获得Http客户端(可以理解为:你得先有一个浏览器;注意:实际上HttpClient与浏览器是不一样的)CloseableHttpClient httpClient =HttpClientBuilder.create().build();// 创建Post请求HttpPost httpPost =newHttpPost(wsdlURL);StringEntity entity =newStringEntity(content.toString(),"UTF-8");// 将数据放入entity中
        httpPost.setEntity(entity);
        httpPost.setHeader("Content-Type", contentType);// 响应模型CloseableHttpResponse response =null;String result =null;try{// 由客户端执行(发送)Post请求
            response = httpClient.execute(httpPost);// 从响应模型中获取响应实体// 注意:和doHttpPostByRestTemplate方法用的不是同一个HttpEntityorg.apache.http.HttpEntity responseEntity = response.getEntity();System.out.println("响应ContentType为:"+ responseEntity.getContentType());System.out.println("响应状态为:"+ response.getStatusLine());if(responseEntity !=null){
                result =EntityUtils.toString(responseEntity);System.out.println("响应内容为:"+ result);}}finally{// 释放资源if(httpClient !=null){
                httpClient.close();}if(response !=null){
                response.close();}}return result;}/**
     * 使用springframework的RestTemplate发送http
     *
     * @param wsdlURL
     *            请求URL
     * @param contentType
     *            如:application/json;charset=utf8
     * @param content
     *            数据内容
     * @DATE 2018年9月22日 下午10:30:48
     */staticStringdoHttpPostByRestTemplate(finalString wsdlURL,finalString contentType,finalString content){// http使用无参构造;https需要使用有参构造RestTemplate restTemplate =newRestTemplate();// 解决中文乱码List<HttpMessageConverter<?>> converterList = restTemplate.getMessageConverters();
        converterList.remove(1);HttpMessageConverter<?> converter =newStringHttpMessageConverter(StandardCharsets.UTF_8);
        converterList.add(1, converter);
        restTemplate.setMessageConverters(converterList);// 设置Content-TypeHttpHeaders headers =newHttpHeaders();
        headers.remove("Content-Type");
        headers.add("Content-Type", contentType);// 数据信息封装// 注意:和doHttpPostByHttpClient方法用的不是同一个HttpEntityorg.springframework.http.HttpEntity<String> formEntity =neworg.springframework.http.HttpEntity<String>(
                content, headers);String result = restTemplate.postForObject(wsdlURL, formEntity,String.class);return result;}}

七、处理响应结果

  • 解析响应:将接收到的响应报文进行解析,提取出需要的数据。这通常涉及到对XML格式的响应报文进行解析和处理。
  • 错误处理:在对接过程中,可能会遇到各种错误和异常情况。因此,需要添加适当的错误处理逻辑来应对这些情况。
标签: intellij-idea java ide

本文转载自: https://blog.csdn.net/qq_52690469/article/details/143673130
版权归原作者 A.不愿起名字的人 所有, 如有侵权,请联系我们删除。

“Idea调用WebService”的评论:

还没有评论