zoukankan      html  css  js  c++  java
  • 最简单易懂的webService客户端之soap+xml请求

    代码准备:

      1.网络上有提供一些免费的服务器测试地址,可以上这里找一找:https://my.oschina.net/CraneHe/blog/183471

      2.我选择了一个翻译地址:http://www.webxml.com.cn/WebServices/TranslatorWebService.asmx

        2.1打开之后看到该地址下有一个方法:

        2.2点击进入,网站会提供该方法的客户端请求xml格式:

        2.3,这个红框部分就是我们要的,将它写入代码,就可以完成请求了.

        注意:以上还是获取soap请求xml的方法,也是比较入门的方式,有经验的筒子直接上wsdl利用解释文档也可以自己写xml...

    然后是代码,我直接附上代码,大家直接复制即可运行,附注释.

    Translate.class
    import java.io.ByteArrayOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    /**
     * Created by garfield on 2016/10/16.
     */
    
    
    
    public class Translate {
        public static void translate(String word ) throws Exception {
            //地址
            String urlString = "http://www.webxml.com.cn/WebServices/TranslatorWebService.asmx ";
            //方法
            String soapActionString = "http://WebXml.com.cn/getEnCnTwoWayTranslator";
            URL url = new URL(urlString);
            HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
            //拼接请求体,此处也可以在外面写xml文件然后读取,但是为了方便一个文件搞定,而且参数也比较好传递我们直接String拼接(直接将网页上的复制进来即可)
            String soap = "<?xml version="1.0" encoding="utf-8"?>
    " +
                    "<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    " +
                    "    <soap:Body>
    " +
                    "        <getEnCnTwoWayTranslator xmlns="http://WebXml.com.cn/">
    " +
                    "            <Word>" + word + "</Word>
    " +
                    "        </getEnCnTwoWayTranslator>
    " +
                    "    </soap:Body>
    " +
                    "</soap:Envelope>";
            byte[] buf = soap.getBytes();
            //设置一些头参数
            httpConn.setRequestProperty("Content-Length", String.valueOf(buf.length));
            httpConn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
            httpConn.setRequestProperty("soapActionString", soapActionString);
            httpConn.setRequestMethod("POST");
            //输入参数和输出结果
            httpConn.setDoOutput(true);
            httpConn.setDoInput(true);
            OutputStream out = httpConn.getOutputStream();
            out.write(buf);
            out.close();
    
            //最后合格解析结果大家就各显神通了,此处打印出解析的过程,最终得到翻译答案
            byte[] datas = readInputStream(httpConn.getInputStream());
            String result = new String(datas);
            System.out.println("result:" + result);
            System.out.println(result.substring(result.indexOf("string") - 1,result.lastIndexOf("string") + 7));
            System.out.println(result.substring(result.indexOf("string") - 1,result.lastIndexOf("string") + 7).replaceAll("</{0,1}(string)?>",""));
        }
    
        /**
         * 从输入流中读取数据
         *
         * @param inStream
         * @return
         * @throws Exception
         */
        public static byte[] readInputStream(InputStream inStream) throws Exception {
            ByteArrayOutputStream outStream = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len = 0;
            while ((len = inStream.read(buffer)) != -1) {
                outStream.write(buffer, 0, len);
            }
            byte[] data = outStream.toByteArray();
            outStream.close();
            inStream.close();
            return data;
        }
    
        public static void main(String[] args) throws Exception {
            translate("sea");
        }
    }

    运行结果:

    result:<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><getEnCnTwoWayTranslatorResponse xmlns="http://WebXml.com.cn/"><getEnCnTwoWayTranslatorResult><string>sea: [ si: ]</string><string>n. 海,海洋 |</string></getEnCnTwoWayTranslatorResult></getEnCnTwoWayTranslatorResponse></soap:Body></soap:Envelope>
    <string>sea: [ si: ]</string><string>n. 海,海洋 |</string>
    sea: [ si: ]n. 海,海洋 |

      第一行是直接返回的结果,下面两行帮助理解解析,最后得到sea单词的解释,是不是简单清楚...

      第二期补充:有筒子可能有问题,那我要写的soap只有wsdl地址怎么办,而且还要求有请求头验证,这个我也找了之前写的一个请求代码,同样非常简单,用到的jar包只有httpclient

    <!-- https://mvnrepository.com/artifact/commons-httpclient/commons-httpclient -->
          <dependency>
              <groupId>commons-httpclient</groupId>
              <artifactId>commons-httpclient</artifactId>
              <version>3.1</version>
          </dependency>

    TestService.java

    import org.apache.commons.httpclient.HttpClient;
    import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
    import org.apache.commons.httpclient.methods.PostMethod;
    import org.apache.commons.httpclient.methods.RequestEntity;
    
    import java.io.ByteArrayInputStream;
    import java.io.InputStream;
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * Created by garfield on 2016/10/12.
     */
    public class TestWebService {
        public static void main(String[] args) throws Exception {
            Map<String, String> map = new HashMap<String, String>();
            //拼接xml请求,带有请求头
            String params = "<id>5</id>";//随手举个例子,类似...
            String soapRequestData = "<soapenv:Envelope 
    " +
                    "	xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    " +
                    "	xmlns:ser="http://service.resource.ws.bd.newland.com/">
    " +
                    "   <soapenv:Header>
    " +
                    "	<serviceCode>serviceCode</serviceCode>
    " +
                    "	<userName>userName</userName>
    " +
                    "	<authCode>authCode</authCode>
    " +
                    "   </soapenv:Header>
    " +
                    "   <soapenv:Body>
    " +
                    "      <ser:function>
    " +
                    params +
                    "      </ser:function>
    " +
                    "   </soapenv:Body>
    " +
                    "</soapenv:Envelope>
    ";
    
            try {
                String method = "请求地址";//比如http://192.177.222.222:8888/services/Service_Name/Function_Name
                PostMethod postMethod = new PostMethod(method);
                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");
                postMethod.setRequestEntity(re);
    
                HttpClient httpClient = new HttpClient();
                int statusCode = httpClient.executeMethod(postMethod);
                //200说明正常返回数据
                if (statusCode != 200) {
                    //internet error
                    System.out.println(statusCode);
                }
                soapRequestData = postMethod.getResponseBodyAsString();
                System.out.println(soapRequestData);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    好了,将这个简单的代码复制进去,替换一下请求头和请求地址以及参数就可以得到反馈就过了,试用一下吧.

  • 相关阅读:
    数学+高精度 ZOJ 2313 Chinese Girls' Amusement
    最短路(Bellman_Ford) POJ 1860 Currency Exchange
    贪心 Gym 100502E Opening Ceremony
    概率 Gym 100502D Dice Game
    判断 Gym 100502K Train Passengers
    BFS POJ 3278 Catch That Cow
    DFS POJ 2362 Square
    DFS ZOJ 1002/HDOJ 1045 Fire Net
    组合数学(全排列)+DFS CSU 1563 Lexicography
    stack UVA 442 Matrix Chain Multiplication
  • 原文地址:https://www.cnblogs.com/garfieldcgf/p/5966317.html
Copyright © 2011-2022 走看看