java网络编程(3):HTTP协议调用SOAP

来源:互联网 发布:被猎头坑过 知乎 编辑:程序博客网 时间:2024/04/29 17:26

第0章:简介

       简单对象访问协议是交换数据的一种协议规范,是一种轻量的、简单的、基于XML(标准通用标记语言下的一个子集)的协议,它被设计成在WEB上交换结构化的和固化的信息。webService三要素:SOAP、WSDL (Web Services Description Language)、UDDI( Universal Description Discovery and Integration )之一, soap用来传递信息的格式, WSDL 用来描述如何访问具体的接口, uddi用来管理,分发,查询webService 具体实现可以搜索 Web Services简单实例 ; SOAP 可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议(HTTP),简单邮件传输协议(SMTP),多用途网际邮件扩充协议(MIME)。它还支持从消息系统到远程过程调用(RPC)等大量的应用程序。SOAP使用基于XML的数据结构和超文本传输协议(HTTP)的组合定义了一个标准的方法来使用Internet上各种不同操作环境中的分布式对象。(来源:百度百科)


第0节:SOAP消息格式

<SOAP-ENV:Envelope
      各种属性>
 
       
      <!--示例-->
 
 
      <SOAP:HEADER>
 
      </SOAP:HEADER>
 
 
 
      <SOAP:Body>
 
      </SOAP:Body>
 
</SOAP-ENV:Envelope>


构建模块

一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素:
  • 必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息
  • 可选的 Header 元素,包含头部信息
  • 必需的 Body 元素,包含所有的调用和响应信息
  • 可选的 Fault 元素,提供有关在处理此消息所发生错误的信息

语法规则

这里是一些重要的语法规则:
  • SOAP 消息必须用 XML 来编码
  • SOAP 消息必须使用 SOAP Envelope 命名空间
  • SOAP 消息必须使用 SOAP Encoding 命名空间
  • SOAP 消息不能包含 DTD 引用
  • SOAP 消息不能包含 XML 处理指令

例如:


<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:dat="http://dataquery.menergy.com">
   <soapenv:Header/>
   <soapenv:Body>
      <dat:GetMsg>
         <!--Optional:-->
         <dat:req>
            <!--Optional:-->
            <dat:id>123</dat:id>
            <!--Optional:-->
            <dat:type>123</dat:type>
            <!--Optional:-->
            <dat:protocol>123</dat:protocol>
            <!--Optional:-->
            <dat:date>20140224</dat:date>
            <!--Optional:-->
            <dat:cursor>?</dat:cursor>
            <!--Optional:-->
            <dat:pagesize>?</dat:pagesize>
            <!--Optional:-->
            <dat:format>34</dat:format>
         </dat:req>
      </dat:GetMsg>
   </soapenv:Body>
</soapenv:Envelope>

第1节:soapui工具

soapui官网:http://www.soapui.org/

开源中国:http://www.oschina.net/p/soapui/

使用博客:http://blog.csdn.net/hailangamy/article/details/6957355


第2节:札记



第1章:实践

HTTP协议调用SOAP处理类(SoapClientHandler.java):

package com.mcc.core.net;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * 使用HTTP协议调用SOAP处理类
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         DateTime: 14-2-24  下午2:27
 */
public class SoapClientHandler {
    /**
     * 通过HTTP请求方式调用WebSe
     *
     * @param soapUrl     SOAP的URL,包括wsdl段
     * @param soapRequest SOAP的请求
     * @return
     */
    public static String request(String soapUrl, String soapRequest,String soapAction) {
        String actual = "";
        HttpURLConnection connection = null;
        OutputStream os = null;
        PrintWriter out = null;
        InputStream is = null;
        BufferedReader br = null;
        try {
            URL url = new URL(soapUrl);
            connection = (HttpURLConnection) url.openConnection();
            connection.setDoInput(true);
            connection.setDoOutput(true);
            connection.setRequestMethod("POST");

            // 处理请求参数
            os = connection.getOutputStream();
            out = new PrintWriter(os);
            out.println(soapRequest);
            // 发送请求
            out.flush();

            // http status ok
            if (HttpURLConnection.HTTP_OK == connection.getResponseCode()) {
                System.out.println("HTTP_OK");
            }

            // 处理返回信息
            is = connection.getInputStream();
            br = new BufferedReader(new InputStreamReader(is));

            StringBuilder builder = new StringBuilder();
            for (String line = br.readLine(); line != null; line = br.readLine()) {
                builder.append(line);
            }
            actual = builder.toString();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 释放资源
            try {
                if (is != null) {
                    is.close();
                }
                if (os != null) {
                    os.close();
                }
                if (is != null) {
                    is.close();
                }
                if (br != null) {
                    br.close();
                }
                if (out != null) {
                    out.close();
                }
                if (connection != null) {
                    connection.disconnect();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return actual;
    }

    public static void main(String args[]){
        //webservice服务路径,一般为wsdl后缀
        String serviceUrl = "http://192.168.1.100:8181?wsdl";
        StringBuilder request = new StringBuilder();
        //下面格式可以从soapui客户端工具获得
        request.append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:dat=\"http://dataquery.menergy.com\">");
        request.append("<soapenv:Header/><soapenv:Body>");
        request.append("<dat:GetInfo><dat:req>");
        request.append("<dat:id>123</dat:id>");
        request.append("<dat:type>123</dat:type>");
        request.append("<dat:protocol>123</dat:protocol>");
        request.append("<dat:date>20140224</dat:date>");
        request.append("<dat:cursor></dat:cursor>");
        request.append("<dat:pagesize></dat:pagesize>");
        request.append("<dat:format>34</dat:format>");
        request.append(" </dat:req></dat:GetInfo>");
        request.append("</soapenv:Body></soapenv:Envelope>");
        // 组装SOAP请求的参数
        String soapRequest = request.toString();
        // SOAP ACTION ,对应xmlns命名空间方法路径
        String soapAction = "http://dataquery.menergy.com/GetInfo";
        // 使用HTTP协议调用SOAP的数据
        String response = SoapClientHandler.request(serviceUrl, soapRequest, soapAction);
        //web service 返回结果
        System.out.println("响应结果:\n" + response);
    }
}


0 0
原创粉丝点击