WebService学习记录----客户端数据发送

引言:
近期由于公司需要,开始接触WebService Java端的接口制作。在服务端的创建与客户端的连接方面出现了很多问题,本文先就客户端出现的问题进行一些说明。
刚开始做客户端的时候考虑对面使用的是CXF框架(ABAP语言),那么我也在本地使用了cxf框架并使用其方法对他们的接口进行了调用,因为对方设置了web访问权限导致我 每次连接都是报的401错误 ,那么我开始考虑有没有添加账号密码的方法,但由于个人能力问题,终究还是没有找到。于是我想起了Jax-WS 本身也是带有调用service的方法,于是我使用其本身的方法创建service并getPo
-rt,调用方法。但每次在service对象被new出来的时候都是报的401错误,很是恼火。于是我上网查资料看到有人使用到java.net包里HttpURLConnection 这个类去创建连接并且直接给对方传了一个XML,于是就尝试了一下,真的测通了,也算暂时解决了一个问题,下面附上代码。

package com.erp.clint;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import sun.misc.BASE64Encoder;

public class test2 {


    public static void main(String[] args) {        
             URL url  ; 
             HttpURLConnection conn;
            try {
        //这个地址前面有可能是连接外网的地址,如果局域网访问,请换成本地ip
                url = new URL("目标地址:这个地址是wsdl下面<soap:address location>包含的地址,
              conn = (HttpURLConnection)url.openConnection();
                String username = "用户名";
                String password = "密码";
                String input = username+":"+password;
                String encoding = new BASE64Encoder().encode(input.getBytes()); 
                 //这一步很有必要,因为在数据传输过程中账号密码被放在头信息key为Authorization的下面,值是Basic空格和账号
                  //密码的转码的组合   
                 //Basic后面的空格一定加上,坑了我一个小时。 
                   conn.setRequestProperty("Authorization", "Basic "+encoding); 
                //打开输入输出的开关 
                       conn.setDoOutput(true); 
                       conn.setDoInput(true);
                       conn.setUseCaches(false);
                // conn.setRequestProperty("X-HTTP-Method-Override", "PATCH"); 
                // conn.setRequestMethod("post");
                //设置请求的头信息 
                     conn.setRequestProperty("Accept-encoding", "gzip,deflate");
                     conn.setRequestProperty("Content-type", "text/xml;charset=UTF-8");
                     conn.setRequestProperty("connection", "Keep-Alive"); 
                     conn.connect();
                     String data ="<soapenv:Header/>"
                          +"<soapenv:Body>" 
                                +"<urn:MT_MES_MOConf02>"
                                    +"<ZTABLE>" 
                                      +" <!--Zero or more repetitions:-->"
                                           +"<ITEM1>" 
                                               +"<MESSAGEID>测试11111111</MESSAGEID>"
                                               +"<AUFNR>测试11111111</AUFNR>" 
                                               +"<VORNR>测试11111111</VORNR>" 
                                               +"<LMNGA>测试11111111</LMNGA>" 
                                               +"<XMNGA>测试11111111</XMNGA>" 
                                               +"<ISM01>测试11111111</ISM01>" 
                                               +"<ISM02>测试11111111</ISM02>" 
                                               +"<ISM03>测试11111111</ISM03>" 
                                               +"<BUDAT>测试11111111</BUDAT>" 
                                               +"<CONFIRMID>测试11111111</CONFIRMID>" 
                                               +"<ACTION>测试11111111</ACTION>" 
                                               +"<BUFFER1>?</BUFFER1>"
                                               +"<BUFFER2>?</BUFFER2>" 
                                               +"<BUFFER3>?</BUFFER3>" 
                                               +"<BUFFER4>?</BUFFER4>" 
                                               +"<BUFFER5>?</BUFFER5>" 
                                               +"<BUFFER6>?</BUFFER6>" 
                                               +"<BUFFER7>?</BUFFER7>"
                                               +"<BUFFER8>?</BUFFER8>" 
                                               +"<BUFFER9>?</BUFFER9>" 
                                               +"<BUFFER10>?</BUFFER10>" 
                                             +"</ITEM1>" 
                                       +"</ZTABLE>" 
                                   +"</urn:MT_MES_MOConf02>" 
                              +"</soapenv:Body>"
                    +"</soapenv:Envelope>" ; 
                 System.out.println("数据是"+data); 
              //获得输出流 
                 OutputStream out = conn.getOutputStream(); 
             //发送数据 
                 out.write(data.getBytes("UTF-8")); 
                 out.flush(); 
                 out.close(); 
           //判断请求成功 
               System.out.println("返回码是"+conn.getResponseCode()); 
     } catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} }}

可能有人会问,你怎么知道传输的XML文档的格式,那么我可以介绍一款软件SoapUI 这是一款专门用于测试wsdl的软件(我只知道这个用处嘻嘻),通过这个软件可以知道你需要传输的wsdl文件的格式,然后拼接成xml字符串即可完成数据传输。返回码是200就代表成功了亲。由于是测试用,并没有对代码进行格式化,异常处理也就只是瞎糊弄。

调试错误
由于本人新手,在调试期间出现了各种错误,其中一个是总报405错误,我查了很多次也没有瞧出端倪,无奈之下只能借助于Wireshark这款软件
和SoapUI ,先用soapUI构建一个测通的连接然后用Wireshark来观察连接中两个端口的数据交互,然后发现我的url填错了,总报错的url是wsdl文件的url,而实际接收数据的url是wsdl文件 标签内包含的地址 这也算是低级错误了。
另一个错误是总报401错误,同样是借助与上文提到的两款软件,发现登录权限的账号密码是以:
Authorization: Basic bWVzcmZjdXNlcjptZXMzMjEzMjE=\r\n 这种形式在数据交互的时候被传递的,当然,真正的数据都是些字节码。然后请注意这个Basic后面的空格这个空格坑了我一个多小时。
当然我还遇到了很多其他的错误,都是百度啊,哎。
老司机!求带啊。
 最后:本文在编辑代码的时候出现了好多情况,如果出现多个符号或者少个括号什么的,请见谅。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值