java 肥皂 ui 生成的代码
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5543570/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
soap ui generated code
提问by grantk
I have a webservice I am trying to build a client for.
我有一个网络服务,我正在尝试为其构建客户端。
I have the following wsdl:
我有以下 wsdl:
http://www.cmicdataservices.com/datacenter/service.asmx?wsdl
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.
它需要身份验证。查看 WSDL 描述,我看不到将身份验证对象、用户名和密码作为参数的方法。使用 Netbeans,我为 WSDL 生成了 jax-ws 源。然而,我无法弄清楚在那之后该怎么做。
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.
使用soapui我可以连接到网络服务并运行所有方法。但再一次,我想将它构建到一个无需我交互即可运行的客户端中。
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?
我的问题在于弄清楚如何使用这个生成的代码,看起来 netbeans.tv 有一个视频(netbeans soapui plugin video 2),它已经丢失了。有谁知道任何教程或知道如何使用此生成的代码访问网络服务的任何示例?
so I have a method CheckifAuthorized()
所以我有一个方法 CheckifAuthorized()
Running in soapui I get the following xml
在soapui中运行我得到以下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>
I can then run that request in soap ui and get back the response that authentication was a success.
然后我可以在soap ui中运行该请求并返回身份验证成功的响应。
With the jax-ws code generated with netbeans and with soapui as well I have the following:
使用netbeans和soapui生成的jax-ws代码,我有以下内容:
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
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.
这与我在尝试将 python 用于服务时遇到的问题相同。从那以后,我选择使用 Java,因为我觉得在解析 xml 和创建对象方面可能有更快的周转时间,因为我已经有了为此创建的实体。
Thank you.
谢谢你。
Grant
授予
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:
我不想回答这个问题,因为我仍然想弄清楚我可以在这里做什么,但我最终只是用以下内容手工编写了请求。现在我可以将它转换为一个 xml 对象并按照我的方式进行,但我认为 soapui 使所有这一切变得更加容易。我真正不明白的是如何使用soapui来构建这个请求并将其合并到我的项目中:
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);
}
}
回答by Artem Zankovich
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:
您的代码的问题在于 SOAP 标头中缺少 Authentication 元素。看看 WSDL,它应该总是在那里:
<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>
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.
当 CheckIfAuthorized 请求中没有 Authentication 元素时,由于 XML 不正确,您的服务器失败并出现异常。下面是Python中的示例客户端来演示解决问题的想法,我认为将其转换为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()