如何在Java中创建这样的SOAP请求?

时间:2013-11-20 17:50:29

标签: java web-services soap

我在使用Java的 WebServices 审讯中相当新,我有以下问题。

我有一个网络服务,它提供了一个 getConfigSettings()方法,通过它的响应,告诉我一些信息,包括用户是否在某项服务上启用(它说如果这对夫妇用户名密码是正确的,并且用户可以登录系统。)

特别是 getConfigSettings()方法的 REQUEST

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
   <soapenv:Header/>
   <soapenv:Body>
      <tem:getConfigSettings>
         <!--Optional:-->
         <tem:login>name.surname</tem:login>
         <!--Optional:-->
         <tem:password>rightPawssword</tem:password>
         <!--Optional:-->
         <tem:ipAddress>144.44.55.4</tem:ipAddress>
         <!--Optional:-->
         <tem:clientVersion>1</tem:clientVersion>
         <!--Optional:-->
         <tem:lastUpdateTime>2</tem:lastUpdateTime>
      </tem:getConfigSettings>
   </soapenv:Body>
</soapenv:Envelope>

这是网络服务响应,以防夫妻用户名密码正确且用户可以登录系统:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <getConfigSettingsResponse xmlns="http://tempuri.org/">
         <getConfigSettingsResult>
            <![CDATA[
                <root>
                    <status>
                        <id>0</id>
                        <message></message>
                    </status>
                    <drivers>
                        <drive id="tokenId 11">
                          <shared-secret>Shared 11</shared-secret>
                          <encoding>false</encoding>
                          <compression />
                        </drive>
                        <drive id="tokenId 2 ">
                          <shared-secret>Shared 2  </shared-secret>
                          <encoding>false</encoding>
                          <compression>false</compression>
                        </drive>
                    </drivers>
                </root>
            ]]>
        </getConfigSettingsResult>
      </getConfigSettingsResponse>
   </s:Body>
</s:Envelope>

在此回复中,重要的部分是:

<status>
    <id>0</id>
    <message></message>
</status>

因为<id>0</id>表示用户可以登录系统

相反,如果情侣用户名密码 不正确,我将获得以下响应:< / p>

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <getConfigSettingsResponse xmlns="http://tempuri.org/">
         <getConfigSettingsResult><![CDATA[<root>
                        <status>
                            <id>-1</id>
                            <message>Login or password incorrect</message>
                        </status>
                        </root>]]></getConfigSettingsResult>
      </getConfigSettingsResponse>
   </s:Body>
</s:Envelope>

正如您在本案例中所见,我有<id>-1</id>(表示出现错误的情况),并在消息标记中指定了发生错误的类型。

好的,现在我必须创建一个调用此 getConfigSettings()方法的Java方法,向其传递所请求的5个参数:登录密码 ipAddress clientVersion lastUpdateTime (如果在此阶段唯一重要的参数是登录和< strong>密码,其他可以是......)

现在我不知道它是怎么做的。

在我的项目中,还有另一种方法可以调用同一Web服务的另一个请求报告:

public String getVersion() {
    java.net.URL url = null;
    java.net.URLConnection conn = null;

    java.io.BufferedReader rd = null;
    String soapResponse = "";

    String risultato = "";

    // SOAP ENVELOP for the request:
    String soapRequest;
    soapRequest = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:tem=\"http://tempuri.org/\">" + "<soapenv:Header/>" + "<soapenv:Body> " + "<tem:getVersion/>" + "</soapenv:Body>" + "</soapenv:Envelope>";

    try {

        // Try to open a connection
        url = new java.net.URL(_webServiceUrl);
        conn = url.openConnection();

        // Set the necessary header fields
        conn.setRequestProperty("SOAPAction", "http://tempuri.org/IMyService/getVersion");
        conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
        conn.setDoOutput(true);

        // Send the request:
        java.io.OutputStreamWriter wr = new java.io.OutputStreamWriter(conn.getOutputStream());
        wr.write(soapRequest);
        wr.flush();
        // Read the response
        rd = new java.io.BufferedReader(new java.io.InputStreamReader(conn.getInputStream()));

        // Put the entire response into the soapResponse variable:
        String line;
        while ((line = rd.readLine()) != null) {
            //System.out.println(line);
            soapResponse = soapResponse + line + System.getProperty("line.separator");
        }

        rd.close();

        // PERFORM SOME ELABORATION ON THE RESPONSE
        ..........................................
                    ..........................................
        ..........................................
                    ..........................................
                    return risultato;
}

看着这种工作方法,在我看来,做了类似的事情:

  1. 它为我的请求创建一个包含 SOAP Envelop 的String对象。

  2. 尝试连接到我的WebService。

  3. 然后设置必要的标题字段(这对我来说不清楚,究竟是什么意思?什么是 tempuri ?),究竟是什么以下几行:

        conn.setRequestProperty("SOAPAction", "http://tempuri.org/IMyService/getVersion");
        conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
        conn.setDoOutput(true);
    
  4. 将我准备好的请求发送到WebService

  5. 获取回复并将其放入 String soapResponse 变量

  6. 这是我想要创建的其他 authentication()方法,我必须使用以前的参数创建 SOAP Envelop ,将其发送到Web服务和获取SOAP响应。

    我认为我的主要问题是如何使用参数创建正确的 String soapRequest 对象。

0 个答案:

没有答案