引言:
近期由于公司需要,开始接触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后面的空格这个空格坑了我一个多小时。
当然我还遇到了很多其他的错误,都是百度啊,哎。
老司机!求带啊。
最后:本文在编辑代码的时候出现了好多情况,如果出现多个符号或者少个括号什么的,请见谅。