【问题标题】:soap ui generated code肥皂 ui 生成的代码
【发布时间】:2011-04-04 19:51:05
【问题描述】:

我有一个正在尝试为其构建客户端的网络服务。

我有以下 wsdl:

http://www.cmicdataservices.com/datacenter/service.asmx?wsdl

它需要身份验证。查看 WSDL 描述,我没有看到将身份验证对象、用户名和密码作为参数的方法。使用 Netbeans,我为 WSDL 生成了 jax-ws 源。但是我不知道在那之后该怎么办。

使用soapui,我可以连接到网络服务并运行所有方法。但再一次,我想将它构建成一个无需我交互即可运行的客户端。

我的问题在于弄清楚如何使用这个生成的代码,似乎 netbeans.tv 有一个视频(netbeans soapui 插件视频 2)已经丢失了。有谁知道任何教程或知道如何使用此生成的代码访问网络服务的任何示例?

所以我有一个方法 CheckifAuthorized()

在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>

然后我可以在soap ui中运行该请求并返回验证成功的响应。

使用 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();
    }
}

这将失败并出现以下错误

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 和创建对象可能更快,因为我已经创建了实体。

谢谢。

授予

我不想回答这个问题,因为我仍然想弄清楚我可以在这里做什么,但我最终只是用以下内容手工编写了请求。现在我可以将它转换为一个 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);
         }
     }

【问题讨论】:

    标签: java soap netbeans soapui


    【解决方案1】:

    您的代码的问题是 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>
    

    当 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多