• 最简单易懂的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();
            }
        }
    }

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

  • 相关阅读:
    网络
    oracle 操作
    oracle可重复执行脚本(添加字段)
    c#命名规范(转载)
    Oracle修改表结构字段名和字段长度
    C#Winform的DEV下拉下拉控件介绍
    TPL DataFlow初探(二)
    TPL DataFlow初探(一)
    C# Winform 跨线程更新UI控件常用方法汇总(多线程访问UI控件)
    C# 关于委托
  • 原文地址:https://www.cnblogs.com/garfieldcgf/p/5966317.html
Copyright © 2020-2023  润新知