问题描述
我有一个网络服务我正在尝试建立一个客户端。
I have a webservice I am trying to build a client for.
我有以下wsdl:
http://www.cmicdataservices.com/datacenter/service.asmx?wsdl
它需要身份验证。查看WSDL描述,我看不到采用认证对象的方法,也没有使用用户名和密码作为参数。使用Netbeans我已经为WSDL生成了jax-ws源代码。然而,我无法弄清楚在那之后该怎么做。
It requires authentication. Looking at the WSDL description I see no method that takes an authentication object, nor username and passwords as arguments. Using Netbeans I have generated jax-ws sources for the WSDL. I however can not figure out what to do after that.
使用soapui我可以连接到webservice并运行所有方法。但是再一次,我想把它构建成一个可以在没有我交互的情况下运行的客户端。
Using soapui I can connect to the webservice and run all the methods. But once again, I want to build this into a client that can be run without my interaction.
我的问题在于弄清楚如何使用这个生成的代码,它是似乎netbeans.tv有一个视频(netbeans soapui插件视频2),后来丢失了。有没有人知道任何教程或知道如何使用这个生成的代码访问webservice的任何例子?
My problem comes in figuring out how to use this generated code, which it appears netbeans.tv had a video(netbeans soapui plugin video 2) which has since been lost. Does anyone know of any tutorials or know of any examples of how I can use this generated code to access the webservice?
所以我有一个方法CheckifAuthorized()
so I have a method CheckifAuthorized()
在soapui中运行我得到以下xml
Running in soapui I get the following xml
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:cmic="http://www.cmicdataservices.com/">
<soap:Header>
<cmic:Authentication>
<!--Optional:-->
<cmic:UserName>username</cmic:UserName>
<!--Optional:-->
<cmic:Password>password</cmic:Password>
</cmic:Authentication>
</soap:Header>
<soap:Body>
<cmic:CheckIfAuthorized/>
</soap:Body>
</soap:Envelope>
然后我可以在soap ui中运行该请求并获得认证成功的响应。
I can then run that request in soap ui and get back the response that authentication was a success.
使用netbeans和soapui生成的jax-ws代码我还有以下内容:
With the jax-ws code generated with netbeans and with soapui as well I have the following:
package javaapplication7;
/**
*
* @author grant
*/
public class Main {
public static void main(String[] args) {
Boolean result = checkIfAuthorized();
System.out.println("The result is: " + result);
}
private static boolean checkIfAuthorized() {
javaapplication7.CMICDatacenterService service = new javaapplication7.CMICDatacenterService();
javaapplication7.CMICDatacenterServiceSoap port = service.getCMICDatacenterServiceSoap();
return port.checkIfAuthorized();
}
}
这将失败并出现以下错误
This will fail with the following error
run:
Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: Server was unable to process request. ---> Object reference not set to an instance of an object.
at com.sun.xml.internal.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:178)
at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:111)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:108)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78)
at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:107)
at $Proxy30.checkIfAuthorized(Unknown Source)
at javaapplication7.Main.checkIfAuthorized(Main.java:24)
at javaapplication7.Main.main(Main.java:17)
Java Result: 1
这是我在尝试使用python进行服务时遇到的同样问题。我已经选择使用Java,因为我觉得我可以更快地解析xml并创建对象,因为我已经创建了这个实体。
This is the same problem I ran into when trying to use python for the service. I have since chosen to go with Java as I feel I may have quicker turnaround on parsing the xml and creating objects as I already have the entities for this created.
谢谢。
拨款
我不想回答这个问题因为我还想知道我能做些什么在这里做,但我最终只是手动编写了以下请求。现在我可以将它转换为一个xml对象,并按照我的方式进行,但我想,soapui使这一切变得更加容易。我真正不明白的是如何使用soapui构建此请求并将其合并到我的项目中:
I did not want to answer this because I would still like to figure out what I can do here, but I did just end up writing the request by hand with the following. Now I can just convert this into an xml object and go about my way, but I imagine soapui makes all of this much easier. What I really do not understand is how to use soapui to build this request and incorporate it into my project:
public class Main {
public final static String DEFAULT_SERVER =
"http://www.cmicdataservices.com/datacenter/service.asmx";
public final static String SOAP_ACTION =
"http://www.cmicdataservices.com/CheckIfAuthorized";
public static void main(String[] args) {
String server = DEFAULT_SERVER;
String UserName = "Username";
String Password="Password";
try{
URL url = new URL(server);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/soap+xml; charset=utf-8");
connection.setRequestProperty("Host", "www.cmicdataservices.com");
OutputStream out = connection.getOutputStream();
Writer wout = new OutputStreamWriter(out);
// Uncomment the following and comment out the previous two lines to see your xml
//BufferedWriter wout = new BufferedWriter(new FileWriter("/tmp/testXML.xml"));
//Start writing soap request - Envelope
wout.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n");
wout.write("<soap12:Envelope ");
wout.write("xmlns:xsi=");
wout.write("'http://www.w3.org/2001/XMLSchema-instance' ");
wout.write("xmlns:xsd=");
wout.write("'http://www.w3.org/2001/XMLSchema' ");
wout.write("xmlns:soap12=");
wout.write("'http://www.w3.org/2003/05/soap-envelope'>\r\n");
//Soap request header start
wout.write("<soap12:Header>\r\n");
//Start writing soap request - Authentication
wout.write("<Authentication xmlns=");
wout.write("'http://www.cmicdataservices.com/'>\r\n");
wout.write("<UserName>" + UserName + "</UserName>\r\n");
wout.write("<Password>" + Password + "</Password>\r\n");
// End Authentication
wout.write("</Authentication>\r\n");
//End the header
wout.write("</soap12:Header>\r\n");
//Start writing the body
wout.write("<soap12:Body>");
wout.write("<GetCurrentDataVer1 xmlns=");
wout.write("'http://www.cmicdataservices.com/' />\r\n");
// End the Body
wout.write("</soap12:Body>\r\n");
// End the Envelope
wout.write("</soap12:Envelope>\r\n");
wout.flush();
wout.close();
//BufferedWriter fout = new BufferedWriter(new FileWriter("/tmp/testXMLResponse.xml"));
InputStream in = connection.getInputStream();
createFile(in, "/tmp/testXMLResponse.xml");
}
catch (IOException e) {
System.err.println(e);
}
}
public static void createFile(InputStream io, String fileName) throws IOException {
FileOutputStream fout = new FileOutputStream(fileName);
byte[] buf = new byte[256];
int read = 0;
while ((read = io.read(buf)) != -1){
fout.write(buf, 0, read);
}
}
推荐答案
您的代码问题是SOAP标头中缺少Authentication元素。看看WSDL,它应该始终存在:
The problem with your code is lack of Authentication element in the SOAP header. Take a look at the WSDL, it should always be there:
<wsdl:operation name="CheckIfAuthorized">
<soap:operation soapAction="http://www.cmicdataservices.com/CheckIfAuthorized" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
<soap:header message="tns:CheckIfAuthorizedAuthentication" part="Authentication" use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
当CheckIfAuthorized请求中没有Authentication元素时,由于XML不正确,服务器因异常而失败。下面是Python中的示例客户端,用于演示解决问题的想法,我认为将其转换为Java不是问题。
You server fails with exception because of incorrect XML when there is no Authentication element in the CheckIfAuthorized request. Here is sample client in Python to demonstrate the idea of solving the problem, I think it's not a problem for you to convert it to Java.
from suds.client import Client
client = Client("http://www.cmicdataservices.com/datacenter/service.asmx?wsdl")
auth = client.factory.create('Authentication')
auth.UserName = "username"
auth.Password = "password"
client.set_options(soapheaders=auth)
client.service.CheckIfAuthorized()
这篇关于soap ui生成的代码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!