最简单易懂的webService客户端之soap+xml请求

本文转自:http://www.cnblogs.com/garfieldcgf/p/5966317.html

代码准备:

  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 = "\n" +
                "\n" +
                "    \n" +
                "        \n" +
                "            " + word + "\n" +
                "        \n" +
                "    \n" +
                "";
        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("",""));
    }

    /**
     * 从输入流中读取数据
     *
     * @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:sea: [ si: ]n. 海,海洋 |
sea: [ si: ]n. 海,海洋 |
sea: [ si: ]n. 海,海洋 |

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

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


      
          commons-httpclient
          commons-httpclient
          3.1
      

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 map = new HashMap();
        //拼接xml请求,带有请求头
        String params = "5";//随手举个例子,类似...
        String soapRequestData = "\n" +
                "   \n" +
                "\tserviceCode\n" +
                "\tuserName\n" +
                "\tauthCode\n" +
                "   \n" +
                "   \n" +
                "      \n" +
                params +
                "      \n" +
                "   \n" +
                "\n";

        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();
        }
    }
}
复制代码

你可能感兴趣的:(计算机网络)