添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在接口对接当中,WebService接口占有着很大份额,而我们为了使用这些接口,不得不引入类似Axis等库来实现接口请求。

现在有了Hutool,就可以在无任何依赖的情况下,实现简便的WebService请求。

使用SoapUI解析WSDL地址,找到WebService方法和参数。
我们得到的XML模板为:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://WebXml.com.cn/">
   <soapenv:Header/>
   <soapenv:Body>
      <web:getCountryCityByIp>
         <!--Optional:-->
         <web:theIpAddress>?</web:theIpAddress>
      </web:getCountryCityByIp>
   </soapenv:Body>
</soapenv:Envelope>

按照SoapUI中的相应内容构建SOAP请求。
我们知道:

方法名为:web:getCountryCityByIp
参数只有一个,为:web:theIpAddress
定义了一个命名空间,前缀为web,URI为http://WebXml.com.cn/
这样我们就能构建相应SOAP请求:

// 新建客户端
SoapClient client = SoapClient.create("http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx")
    // 设置要请求的方法,此接口方法前缀为web,传入对应的命名空间
    .setMethod("web:getCountryCityByIp", "http://WebXml.com.cn/")
    // 设置参数,此处自动添加方法的前缀:web
    .setParam("theIpAddress", "218.21.240.106");
    // 发送请求,参数true表示返回一个格式化后的XML内容
    // 返回内容为XML字符串,可以配合XmlUtil解析这个响应
    Console.log(client.send(true));

三、设置消息头

在业务中有遇到一个问题,就是使用CXF动态生成的SoapClient去访问WebService,在idea上运行没有问题,但是打包之后就各种问题了。于是立即换了Hutool的SoapClient,但是有个问题就是官方文档只给出了最简单的例子。比如如下的xml模板我们该怎么实现?

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
   <soapenv:Header>
      <tem:Header>
         <!--Optional:-->
         <tem:UserName>?</tem:UserName>
         <!--Optional:-->
         <tem:Password>?</tem:Password>
      </tem:Header>
   </soapenv:Header>
   <soapenv:Body>
      <tem:HelloWorld/>
   </soapenv:Body>
</soapenv:Envelope>

我们按照日常习惯,看看SoapClient里面有哪些方法,于是就看到了header()方法,刚好有两个参数,于是直接拿来使用,然后并没有起效。

SoapClient client = SoapClient.create("http://localhost:65168/WebService1.asmx")
                .setMethod("tem:HelloWorld","http://tempuri.org/")
                .header("UserName","mes")
                .header("Password","123456");
        String soapXmlStr=client.send();

查看源代码发现是被添加到了一个MessageHeader中去了。MessageHeader是消息请求头,嗯,所以不要搞混了,跟我们要添加的Header不是一回事。

 public void addRequestProperty(String key, String value) {
        checkConnected();
        if (key == null)
            throw new NullPointerException ("key is null");
        if (requests == null)
            requests = new MessageHeader();
        requests.add(key, value);

四、设置Header

我们需要访问一个第三方WebService,需要我们传输一个MySoapHeader。使用SoapClient的 client.addSOAPHeader(name)方法,其他方法单独使用会报错。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
   <soapenv:Header>
      <tem:MySoapHeader>
         <!--Optional:-->
         <tem:UserName>?</tem:UserName>
         <!--Optional:-->
         <tem:Password>?</tem:Password>
      </tem:MySoapHeader>
   </soapenv:Header>
   <soapenv:Body>
      <tem:HelloWorld/>
   </soapenv:Body>
</soapenv:Envelope>

我们需要设置QName,然后自己创建xml子节点。

SoapClient.create("http://localhost:65168/WebService1.asmx")
                .setMethod("tem:HelloWorld","http://tempuri.org/")
    QName name = new QName("http://tempuri.org/","MySoapHeader","");
    SOAPHeaderElement mySoapHeader = client.addSOAPHeader(name);
    SOAPElement UserName=mySoapHeader.addChildElement("UserName");
    UserName.setTextContent("mes");
    SOAPElement PassWord=mySoapHeader.addChildElement("PassWord");
    PassWord.setTextContent("123456");
	String soapXmlStr=client.send();

五、通过HttpClient进行访问

来自好心大哥的代码

HttpClient httpClient = new HttpClient();
         tring url = wsconfigVO.getUrl();
        String soapRequestData = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:web=\"http://webServiceNCDataService.webservice.icss.com/\"><soapenv:Header/><soapenv:Body><web:capitalPay><requestXml><![CDATA["
                + exportxml
                + "]]></requestXml></web:capitalPay></soapenv:Body></soapenv:Envelope>";
        Logger.error("[gzcg]bw:"+soapRequestData);
        PostMethod httppost = new PostMethod(url);
        /* 把Soap请求数据添加到PostMethod */
        try {
            httppost.setRequestHeader("Content-Type", "text/xml;charset=UTF-8");
            httppost.setRequestHeader("SOAPAction", "");
            byte[] b = soapRequestData.getBytes("utf-8");
            InputStream is = new ByteArrayInputStream(b, 0, b.length);
            RequestEntity re = new InputStreamRequestEntity(is, b.length,
                    "application/soap+xml; charset=utf-8");
            httppost.setRequestEntity(re);
            httpClient.executeMethod(httppost);
            InputStream rs = httppost.getResponseBodyAsStream();
            // 获取返回流并转换为Document
            Document document = new SAXReader().read(rs, "UTF-8");
            String result = document.asXML();
            Logger.error("[gzsyzr] backxml:"+result);
            // 符号转换
            result = result.replaceAll("&lt;", "<").replaceAll("&gt;", ">");
            result = result.substring(result.lastIndexOf("<?xml"));
            result = result.substring(0, result.indexOf("</MSG>") + 6);
            Logger.error("[gzsyzr] backxml1:"+result);
            return new Object[]{result.trim()};
        } catch (Exception e) {
            Logger.error("调用接口服务报错:" + e.getMessage(), e);
            throw new BusinessException("调用esburlssl接口服务报错:" + e.getMessage(), e);
        } finally {
            httppost.releaseConnection();
                                    SoapHttpClient
 HttpClient轻量级包装(使用IHttpClientFactory ),用于发布消息,使用户可以发送SOAP IHttpClientFactory和标头(如果需要)而无需关心信封。
3.0.0
 将HttpClient替换为HttpClientFactory。
2.2.1
 添加了对取消令牌的支持。
2.2.0
 更新的代码库。
 将测试项目迁移到.net核心应用。
 修复了未发送SOAPAction的错误。
2.1.0
 更新到NetStandardLibrary 2.0
 修复了扩展方法递归调用自己的错误
2.0.0
 主要重构到代码库。
                                    大家WebService接口还在使用生成的类去实现调用的吗?其实Hutool的WebService工具很厉害,但是文档写的不太清楚,或者示例不够多,我主要做医疗业务,对接方基本都是WebService接口,刚开始使用hutool的时候确实花费了挺长时间研究,最终失败告终,奈何业务多,有丰富的机会去尝试,现在基本啥格式的都可以克服了。一、WebService是什么?
                                    在项目开发过程中,有时会用到 webservice 服务,今天给大家带来一个简单好用的 soap请求 工具类。里面用到了两个第三方依赖,大家可以自主进行选择,推荐使用hutool-http包的SoapClient一、项目pom文件添加相关依赖org.apache.axisaxis1.4commons-discoverycommons-discovery0.2commons-loggingcommo...
                                    一,什么是soap,什么是wsdl,为什么要用他们
SOAP是基于XML和HTTP通信协议,xml各种平台,各种语言都支持的一个种语言。http呢它得到了所有的因特网浏览器及服务器的支持。
WSDL 指网络服务描述语言 (Web Services Description Language),是一种使用 XML 编写的文档。这种文档可描述某个 Web service。它可规定服务的位置,
                                    使用Eclipse自动生成Soap Client的代码在项目按右键,选择New -&gt; Other -&gt;Web Services -&gt; Web Service Client,进入向导。加入自有代码,例如加入Envelope Header在xxxxStub.java文件相应的方法中加入:public com.example.api.ApiStatus.EchoResponse ech...
                                    前一段时间在De1CTF中的ShellShellShell以及SUCTF的Upload labs2都涉及到了利用PHP的SoapClient类进行SSRF,因此在这里记录下。
0x01 什么是Soap
SOAP是webService三要素(SOAP、WSDL、UDDI)之一:
WSDL 用来描述如何访问具体的接口。
UDDI用来管理,分发,查询webService。
SOAP(简单对...
                                    我在尝试从SOAP API服务器获取请求时执行以下PHP代码try {$soap = new SoapClient($wsdl,$options);$data = $soap->GetXYZ($params);}catch(Exception $e) {$Lastresponse = $soap->__getLastResponse();}我得到的只是“看起来我们没有XML文档”的响应...
修改php.ini 
得添加extension=php_soap.dll (加载soap 内置包) 
修改soap.wsdl_cache_enabled=1 改为soap.wsdl_cache_enabled=0 这个是soap的缓存,测试的时候最好改为0,上线稳定了改为1
soap有两种模式一种是wsdl,一种是no-wsdl
二,熟悉几个函
 1 import java.util.Date;
 2 import org.apache.commons.lang.time.DateFormatUtils;
 3 import cn.hutool.http.HttpRequest;
 4 i...