热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

(七)发送、接收SOAP消息(以HttpClient方式)(2)

一.为什么要用soap原本我们使用web服务都是根据wsdl生成客户端(生成一堆java文件)然后再调用,本章节讲解如何用soap消息来替代这种方式。二、SOAP消息格式
一.为什么要用soap
  • 原本我们使用web服务都是根据wsdl生成客户端(生成一堆java文件)然后再调用,本章节讲解如何用soap消息来替代这种方式。

二、SOAP消息格式

  • SOAP(简单对象访问协议)是基于XML的消息格式。下面是一个简单的SOAP消息:
xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Header> soap:Header> <soap:Body> ... message data ... <soap:Fault> soap:Fault> soap:Body> soap:Envelope>
  • 正如你可以看到一个SOAP消息包括:

    • Envelope
    • Header
    • Body
      • Message Data
      • Fault (optional)

    相同的SOAP消息结构用于客户端和Web Service服务器之间的请求和响应。

    Body内的Fault元素是可选的。只有Web服务中发生内部错误里才返回。否则,返回正常信息数据。

    SOAP不指定一个消息从客户端如何获取到Web Service,但最常见的情况是通过HTTP。

 

三、案例

 3.1  发布服务

  • 服务接口
package service; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; @WebService public interface IFirstService { @WebResult(name = "addResult") public int add(@WebParam(name = "x") int x, @WebParam(name = "y") int y); }
  • 服务接口实现类
package service; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; @WebService(endpointInterface = "service.IFirstService") public class IFirstServiceImpl implements IFirstService { @Override public int add(int x, int y) { return x + y; } }
  • 发布服务
package publish; import javax.xml.ws.Endpoint; import service.IFirstServiceImpl; public class TestPublish { public static void main(String[] args) { Endpoint.publish("http://localhost:3030/first", new IFirstServiceImpl()); System.out.println("发布成功....."); } }
  •  查看wsdl文件
<definitions targetNamespace="http://service/" name="IFirstServiceImplService"> <types> <xsd:schema> <xsd:import namespace="http://service/" schemaLocation="http://localhost:3030/first?xsd=1" /> xsd:schema> types> <message name="add"> <part name="parameters" element="tns:add" /> message> <message name="addResponse"> <part name="parameters" element="tns:addResponse" /> message> <portType name="IFirstService"> <operation name="add"> <input wsam:Action="http://service/IFirstService/addRequest" message="tns:add" /> <output wsam:Action="http://service/IFirstService/addResponse" message="tns:addResponse" /> operation> portType> <binding name="IFirstServiceImplPortBinding" type="tns:IFirstService"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" /> <operation name="add"> <soap:operation soapAction="" /> <input> <soap:body use="literal" /> input> <output> <soap:body use="literal" /> output> operation> binding> <service name="IFirstServiceImplService"> <port name="IFirstServiceImplPort" binding="tns:IFirstServiceImplPortBinding"> <soap:address location="http://localhost:3030/first" /> port> service> definitions>
  • http://localhost:3030/first?xsd=1文件
<xs:schema version="1.0" targetNamespace="http://service/"> <xs:element name="add" type="tns:add" /> <xs:element name="addResponse" type="tns:addResponse" /> <xs:complexType name="add"> <xs:sequence> <xs:element name="x" type="xs:int" /> <xs:element name="y" type="xs:int" /> xs:sequence> xs:complexType> <xs:complexType name="addResponse"> <xs:sequence> <xs:element name="addResult" type="xs:int" /> xs:sequence> xs:complexType> xs:schema>

 

二、客户端发送、接收soap消息
package com.shyroke.webService_client;

import java.io.IOException;
import java.io.StringReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * Hello world!
 *
 */
public class App {
    public static void main(String[] args) {

        try {

            /**
             * 定义发送soap的消息
             */
            StringBuffer str_xml = new StringBuffer();
            str_xml.append(
                    "");
            str_xml.append(" ");
            str_xml.append("  ");
            str_xml.append("");
            str_xml.append(" 11");
            str_xml.append("20");
            str_xml.append("");
            str_xml.append("");
            str_xml.append("");

            /**
             * 定义post请求
             */
            // 定义post请求地址
            HttpPost httpPost = new HttpPost("http://localhost:3030/first?wsdl");
            // 定义post请求的实体
            HttpEntity entity = new StringEntity(str_xml.toString());
            // 设置post请求的实体和头部
            httpPost.setEntity(entity);
            httpPost.setHeader("Content-Type", "text/xml; charset=UTF-8");

            /**
             * 发送请求并获取返回数据
             */
            @SuppressWarnings("deprecation")
            DefaultHttpClient client = new DefaultHttpClient();
            // 发送请求并获取返回数据
            HttpResponse respOnse= client.execute(httpPost);
            // 获取返回数据中的实体
            HttpEntity respon_entity = response.getEntity();
            // 将返回数据的实体转为字符串
            String respon_str = EntityUtils.toString(respon_entity);

            // 解析字符串
            SAXReader reader = new SAXReader();
            Document document = reader.read(new StringReader(respon_str));
            Element rootElement = document.getRootElement();

            Element resultElement = rootElement.element("Body").element("addResponse").element("addResult");
            String addResult = resultElement.getText();
            System.out.println("addResult = " + addResult);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

结果:

 


推荐阅读
  • 本文章是用106试用通道用java发送短信的例子,复制代码就可使用,但前提有106试用账号和密码---------------------------------- ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • 本文介绍了NetCore WebAPI开发的探索过程,包括新建项目、运行接口获取数据、跨平台部署等。同时还提供了客户端访问代码示例,包括Post函数、服务器post地址、api参数等。详细讲解了部署模式选择、框架依赖和独立部署的区别,以及在Windows和Linux平台上的部署方法。 ... [详细]
  • asp中如何嵌入python的简单介绍
    本文目录一览:1、如何在IIS中执行Python脚本 ... [详细]
  • Eclipse利用HttpClient 写post和get连接到后台
    文件目录如下:第一个包代码如下:packagecn.itcast.login;importcn.itcast.login.service.DataService;importandroid.ap ... [详细]
  • 请先查看上一篇文章HttpClient配置,之后在进行。使用this.myhttp.get(http:192.168.2.139:9002apipatients)方法,读取webapi。因 ... [详细]
  • HttpClient请求https的实例:packagetrain;importjava.io.IOException;importjava.security.NoSuchAlg ... [详细]
  • packagecom.example.uptoserverdemo;importjava.io.File;importjava.io.IOException;importorg.ap ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • .NetCoreWebApi生成Swagger接口文档的使用方法
    本文介绍了使用.NetCoreWebApi生成Swagger接口文档的方法,并详细说明了Swagger的定义和功能。通过使用Swagger,可以实现接口和服务的可视化,方便测试人员进行接口测试。同时,还提供了Github链接和具体的步骤,包括创建WebApi工程、引入swagger的包、配置XML文档文件和跨域处理。通过本文,读者可以了解到如何使用Swagger生成接口文档,并加深对Swagger的理解。 ... [详细]
  • 使用Http-Client4.x的客户端代码:MultipartEntityBuilderbuilderMultipartEntityBuilder ... [详细]
author-avatar
也曾悲摧过_192
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有