java使⽤POST发送soap报⽂请求webservice返回500错误解
⽂章摘要:
本⽂使⽤JAX-WS2.2编译webservice,并使⽤HttpUrlConnection的POST⽅式对wsdl发送soap报⽂进⾏请求返回数据,
对错误Server returned HTTP response code: 500 的解决⽅法进⾏简单分析。
问题描述:
由于课程需要博主需要⾃⼰写⼀个webservice并且通过soap进⾏请求,
于是使⽤JAX-WS编译了下⾯java代码⽣成webservice服务
⽣成webservice的java代码:
@WebService()
public class HelloWorld {
@WebMethod
public String sayHelloWorldFrom(String from) {
System.out.println("getMessage.");
String result = "Hello, world, from " + from;
System.out.println(result);
return result;
}
public static void main(String[] argv) {
System.out.println("Service ");
Object implementor = new HelloWorld ();
String address = "localhost:9000/HelloWorld";
Endpoint.publish(address, implementor);
}
}
查看webservice
在⽹上查到的⼀个⽅法就是通过HttpUrlConnection进⾏请求,这边贴⼀下代码,应该很多⼈都有查到类似的⽅法HttpUrlConnection请求实现代码:
public static void main(String[] args) throws Exception
{
String urlString = "localhost:9000/HelloWorld?wsdl";//⾃定义的wsdl服务
URL url = new URL(urlString);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();//打开连接
String xmlFile = "soap_xml\\l";//要发送的soap格式⽂件
File fileToSend = new File(xmlFile);
byte[] buf = new byte[(int) fileToSend.length()];// ⽤于存放⽂件数据的数组
new FileInputStream(xmlFile).read(buf);
//Content-Length长度会⾃动进⾏计算
httpConn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
httpConn.setRequestMethod("POST");
httpConn.setDoOutput(true);
httpConn.setDoInput(true);
OutputStream out = OutputStream();
out.write(buf);
out.close();
InputStreamReader is = new InputStream());
BufferedReader in = new BufferedReader(is);
String inputLine;
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("l")));// 将结果存放的位置
while ((inputLine = in.readLine()) != null)
{
System.out.println(inputLine);
bw.write(inputLine);
}
bw.close();
in.close();
httpConn.disconnect();
}
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="/soap/envelope/">
<soap:Body>
<sayHelloWorldFrom>
<arg0>
撑撑
</arg0>
</sayHelloWorldFrom>
</soap:Body>
</soap:Envelope>
这段代码是⽹上的,并没有错误,但是⼀运⾏就懵逼了,报了下⾯的错误
明明直接在浏览器查看wsdl接⼝是可以访问页⾯,但是返回500错误
错误代码:
Exception in thread "main" java.io.IOException: Server returned HTTP response code: 500 for URL: localhost:9000/HelloWorld?wsdl
at sun.www.protocol.InputStream0(HttpURLConnection.java:1839)
at sun.www.protocol.InputStream(HttpURLConnection.java:1440)
at soap.HelloSoap.main(HelloSoap.java:38)
flect.NativeMethodAccessorImpl.invoke0(Native Method)
flect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
flect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at flect.Method.invoke(Method.java:497)
at cution.application.AppMain.main(AppMain.java:147)
错误语句指向
InputStreamReader is = new InputStream());
⽽⽹上其他⼤部分⽂章都没有给解决⽅法,或者给了其他的解决⽅法,我就在这边分享⼀下这个问题的详细解决⽅法。
解决流程(⼲货
⾸先应该确认具体的错误,通过下⾯的语句可以了解InputStream的错误详情。
InputStream is = ErrorStream();    //通过getErrorStream了解错误的详情,因为错误详情也以XML格式返回,因此也可以⽤JDOM来获取。
这个语句其实也是从请求的服务⽅取回的错误信息,实质也是xml内容,⽤上⾯的BufferReader那⼀连串的语句解析出具体内容,然后输
出查看,具体代码如下:
InputStream is = ErrorStream();    //通过getErrorStream了解错误的详情,因为错误详情也以XML格式返回,因此也可以⽤JDOM来获取。            InputStreamReader isr = new InputStreamReader(is,"utf-8");
BufferedReader in = new BufferedReader(isr);
String inputLine;
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("l")));// 将结果存放的位置
while ((inputLine = in.readLine()) != null)
{
System.out.println(inputLine);
bw.write(inputLine);
bw.close();
}
in.close();
错误详情输出如下:
<S:Envelope xmlns:S="/soap/envelope/">
<S:Body>
<S:Fault xmlns:ns4="/2003/05/soap-envelope">
<faultcode>
S:Client
</faultcode>
<faultstring>
不到{}sayHelloWorldFrom的分派⽅法
</faultstring>
</S:Fault>
</S:Body>
</S:Envelope>
在这边就要 注意了!这个xml⽂件是第⼀个要点!
分析⼀下这段xml代码,可以看到有⼀个faultcode和faultstring,这就是解决这个问题的第⼀个突破⼝
这样就⼀⽬了然了,错误代码中faultcode所含的是Client,说明传递的消息有误,服务端是没有问题的。
于是从要发送的soap中查错误。
要是有仔细看我发送的l的代码,就可以看到sayHelloWorldFrom那个节点没有写命名空间,实在是查了这么多代码⽹上都没⼈提到,也没有查到关于soap报⽂的编写规范,还以为那边可以不⽤写,于是删掉了。
修改后的l(就是添加了命名空间)
<soap:Envelope xmlns:soap="/soap/envelope/">
<soap:Body>
<m:sayHelloWorldFrom xmlns:m="example/">
<arg0>
撑撑
</arg0>
</m:sayHelloWorldFrom>
</soap:Body>
</soap:Envelope>
⼤括号⾥的地址其实就是wsdl中denfinition⾥定义的targetNameSpace,具体解释我贴个链接吧⼤家⾃⼰看吧,反正知道问题出在这边总算是解决了。
其实出了bug第⼀反应确实应该是Error信息,这样才好针对性的进⾏处理,如果本⽂的⽅法还没办法帮你解决的话,那还是建议⼤家靠前⾯查看错误详情的⽅法去进⾏bug的查~
主要内容到这边结束啦,希望能帮到⼤家~
附录
发送httpUrlConnection的java代码
package soap;
import java.io.*;
import java.HttpURLConnection;
import java.URL;
/**
* Created by cc on 2016/10/21.
*/
public class HelloSoap {
调用webservice服务
public static void main(String[] args) throws Exception
{
String urlString = "localhost:9000/HelloWorld?wsdl";//wsdl⽂档的地址
URL url = new URL(urlString);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();//打开连接
//String soapActionString = "localhost:9000/HelloWorld/sayHelloWorldFrom";//Soap 1.1中使⽤
String xmlFile = "soap_xml\\l";//要发送的soap格式⽂件
File fileToSend = new File(xmlFile);
byte[] buf = new byte[(int) fileToSend.length()];// ⽤于存放⽂件数据的数组
new FileInputStream(xmlFile).read(buf);
//Content-Length长度会⾃动进⾏计算
httpConn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
//httpConn.setRequestProperty("soapActionString",soapActionString);//Soap1.1使⽤其实完全可以不需要
httpConn.setRequestMethod("POST");
httpConn.setDoOutput(true);
httpConn.setDoInput(true);
OutputStream out = OutputStream();
out.write(buf);
out.close();

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。