soap报文略说

来源:互联网 发布:c语言比较字符串大小 编辑:程序博客网 时间:2024/05/21 09:40

简单说一下soap报文,有两种版本的报文的报头。
SOAP_1_1_PROTOCOL与SOAP_1_2_PROTOCOL
分别对应的是

1.1:<SOAP-ENV:Envelope xmlns:SOAP  ENV="http://schemas.xmlsoap.org/soap/envelope/">1.2:<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"><env:Header/><env:Body/></env:Envelope>

以下附带一个报文拼装基类。当时写的比较粗略没有写上解析响应报文的通用方法,只有一个接口的解析响应方法。
这个以后有空填坑

/** * 封装soap报文基类 * 1.1:<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> * 1.2:<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"><env:Header/><env:Body/></env:Envelope> * @author huangtao *创建时间2016年9月2日下午9:07:42 * */public class BaseSOAPMessage  {    //内部维护的报文消息类    private  SOAPMessage message;    //协议(PROTOCOL1_1,PROTOCOL1_2)    private String protocol;    //方法名    private  String option;    //名称空间    private  String namespace;    //缩写,前缀    private String  prefix;    //报文节点(节点名称,值)    private LinkedHashMap<String,String> elements;    final  private static String PROTOCOL1_1=SOAPConstants.SOAP_1_1_PROTOCOL;    final  private static String PROTOCOL1_2=SOAPConstants.SOAP_1_2_PROTOCOL;     /**      * 默认创建1_1版本的soap协议报文,option,namespace,prefix参数若都设置了则返回一个含参报文      * @return      * @throws SOAPException      *创建时间:2016年9月2日下午10:04:39      *@author:huangtao      */    public  SOAPMessage  buildBaseSOAPMessage() throws SOAPException{        MessageFactory messageFactory   = MessageFactory.newInstance();         message = messageFactory.createMessage();            if((!StringUtils.isEmpty(option)&&!StringUtils.isEmpty(namespace)&&!StringUtils.isEmpty(prefix))){                      message=addSOAPMessageElement();                 }            setMessage(message);            return message;     }    /**     *  指定协议版本生成基础报文,option,namespace,prefix参数若都设置了则返回一个含参报文     * @param protocol     * @param PROTOCOL1_1为1.1的soap协议,PROTOCOL1_2为1.2的soap协议.     * @return     * @throws SOAPException     *创建时间:2016年9月2日下午10:02:50     *@author:huangtao     */    public  SOAPMessage  buildBaseSOAPMessage(String protocol ) throws SOAPException{        message = (protocol.equals("PROTOCOL1_1"))?(MessageFactory.newInstance(PROTOCOL1_1).createMessage()):(MessageFactory.newInstance(PROTOCOL1_2).createMessage());        if(((!StringUtils.isEmpty(option)&&!StringUtils.isEmpty(namespace)&&!StringUtils.isEmpty(prefix)))){            message=addSOAPMessageElement();             }            setMessage(message);        return message ;    }    /**     * 将报文转成字节流     * @param message     * @return     *创建时间:2016年9月4日下午12:20:10     *@author:huangtao     */     public  byte[] getSOAPMessageAsBytes( ) {            ByteArrayOutputStream byteStream = new ByteArrayOutputStream();            try {                message.writeTo(byteStream);            } catch (SOAPException ex) {            } catch (IOException ex) {            }            return byteStream.toByteArray();        }     /**      * 将报文转成字符串      * @param message      * @return      *创建时间:2016年9月2日下午9:14:47      *@author:huangtao      */       public  String getSOAPMessageAsString() {            return new String(getSOAPMessageAsBytes( ));        }       /**        * 为soap报文添加节点与值,默认排序以put的先后加入xml节点中        * @param message        * @param elements        * @return        *创建时间:2016年9月2日下午10:49:32        *@author:huangtao     * @throws SOAPException         */       public  SOAPMessage addSOAPMessageElement() throws SOAPException{            //通过SOAPEnvelope有效获取相应的Body和Header等信息              SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();              envelope.setAttribute( "xmlns:"+prefix, namespace);            SOAPBody body = envelope.getBody();            QName eName = new QName(prefix+":"+option);            SOAPBodyElement element = body.addBodyElement(eName);            if(elements!=null){                    for(Map.Entry<String, String> entry:elements.entrySet()){                       element.addChildElement(entry.getKey()).setValue(entry.getValue());               }            return message;}            return message;       }       /**         *获取接口返回报文中return 的值         * @param soapString         * @return         */       public  static String getResultFromXml(String soapString,String operation) {            MessageFactory msgFactory;            String result = null;           try {                msgFactory = MessageFactory.newInstance();                SOAPMessage reqMsg = msgFactory.createMessage(new MimeHeaders(),                        new ByteArrayInputStream(soapString.getBytes("UTF-8")));                reqMsg.saveChanges();                SOAPBody body = reqMsg.getSOAPBody();                Iterator<SOAPElement> iterator = body.getChildElements();                 while (iterator.hasNext()) {                     SOAPElement element = iterator.next();                     String nodeName = "ns2:"+operation+"Response";                     if(nodeName.equals(element.getNodeName())){                         Iterator<SOAPElement> iterator1 = element.getChildElements();                         while (iterator1.hasNext()) {                             SOAPElement elementr = iterator1.next();                             if("return".equals(elementr.getNodeName())){                                 result = elementr.getValue();                             }                         }                     }                }                return result;            } catch (Exception e) {                e.printStackTrace();                return null;            }        }       public  SOAPMessage getMessage() {            return message;        }        public  void setMessage(SOAPMessage message) {            this.message = message;        }        public  String getProtocol() {            return protocol;        }        public  void setProtocol(String protocol) {            this.protocol = protocol;        }        public  String getOption() {            return option;        }        public  void setOption(String option) {            this.option = option;        }        public  String getNamespace() {            return namespace;        }        public  void setNamespace(String namespace) {            this.namespace = namespace;        }        public  String getPrefix() {            return prefix;        }        public  void setPrefix(String prefix) {            this.prefix = prefix;        }        public  LinkedHashMap<String, String> getElements() {            return elements;        }        public  void setElements(LinkedHashMap<String, String> elements) {            this.elements = elements;        }public static void main(String[] args) {}}

具体想知道soap报文确切格式可以下载soapui测试接口地址。就可以看到请求和响应的报文内容。
附带官网地址:https://www.soapui.org/

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 住友39熔接机熔接损耗大怎么办 支付宝实名认证刷脸失败怎么办 支付宝注册刷脸不是本人怎么办 小学科学只考88分中学怎么办 收银机关机时才上传数据是怎么办 刚做的系统玩cf卡屏怎么办 办健康证的资料掉了怎么办 刚刚办得的健康证掉了怎么办 房子都过户了银行贷不了款怎么办 我要办大病迁出应该怎么办啊? 遗产继承后户口没地迁出怎么办 安徽蒙城怎么办去韩国的签证的 夜间有人私自收停车费应该怎么办 上次摸不到环尾丝这次摸到了怎么办 法院判决书下来后对方不给钱怎么办 法院判决书下来了钱还保全么怎么办 深圳路边泊车不知道泊车编号怎么办 当事人进拘留所了我的工资怎么办 昆明公租房住满5年后怎么办 昆明公租房房子到期缴纳金怎么办 看守所犯人银行卡里钱没用完怎么办 中国邮政迟迟没有把信件寄到怎么办 拘留15天放出来还不肯还钱怎么办 人死在拘留所不让看监控怎么办 家人吸毒可他又不愿强戒怎么办 容留他人吸毒时签了强戒怎么办 拘留后发现被拘留是人大代表怎么办 执行局要拘留人找不到人怎么办 开设赌场罪拘留37天了该怎么办 对治安处罚光罚款不拘留怎么办 打架和解后警察不给消案怎么办 12个人片诈骗刑拘了28天怎么办 交警拘留几天后还是没钱赔偿怎么办 平安车主信用卡车牌号填错了怎么办 起诉借钱的人逮起来了怎么办 在法院查不到坐牢人的档案怎么办 人被冤枉敲诈勒索进看守所了怎么办 打架被拘留孩子怎么办三周了 技师被拘留她的家人该怎么办 我是担保人贷款人跑了我该怎么办 公司依旷工理由辞退我该怎么办