2012-08-16 107 views
0

我有一个wsdl和xsd文件,并希望在python上创建SOAP请求到web服务器。我从来没有用过肥皂,所以我的问题可能很简单,但我花了四个小时,并没有找到解决方案。Java:如何创建SOAP请求?

我尝试了两种方法:Android上的低级请求和KSOAP2。

WSDL

<wsdl:message name="<some request>"> 
    <wsdl:part element="txh:<some request>" name="parameters"/> 
</wsdl:message> 
<wsdl:message name="<some response>"> 
    <wsdl:part element="txh:<some response>" name="parameters"/> 
</wsdl:message> 

XSD

<xs:element name=""<some request>"> 
    <xs:annotation> 
     <xs:documentation>"<text>"</xs:documentation> 
    </xs:annotation> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="mode" type="response-mode"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 
<xs:element name="<some response>"> 
    <xs:complexType> 
     <xs:annotation> 
      <xs:documentation>"<text>"</xs:documentation> 
     </xs:annotation> 
     <xs:sequence> 
      <xs:element ref="<text>"/> 
      <xs:element name="<another text>" minOccurs="0"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element name="<name a>" type="xs:int"/> 
         <xs:element name="<name b>" type="xs:int"/> 
         <xs:element name="<name c>" type="xs:int"/> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

代码在安卓

private final static String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + 
         "<SOAP-ENV:Envelope " + 
         "xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" " + 
         "xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\" " + 
         "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " + 
         "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" + 
         "<SOAP-ENV:Header>" + 
         "</SOAP-ENV:Header>" + 
         "<SOAP-ENV:Body xmlns:ns1=\"<namespace>\">" + 
         " <xs:element name=\"<request>\"> " + 
         "<xs:annotation>" + 
          "<xs:documentation>"<text>"</xs:documentation>" + 
         "</xs:annotation>" + 
         "<xs:complexType>" + 
          "<xs:sequence>" + 
           "<xs:element name=\""<text>"\" type=\"response-mode\"/>" + 
          "</xs:sequence>" + 
         "</xs:complexType>" + 
        "</xs:element>" + 
         "</SOAP-ENV:Body>" + 
         "</SOAP-ENV:Envelope>"; 



public Entity execute(final String body) { 
    Log.d(TAG, "Start request "); 
    Entity result = new Entity(); 
    AndroidHttpClient client = AndroidHttpClient.newInstance(TAG); 
    HttpParams params = client.getParams(); 
    HttpConnectionParams.setConnectionTimeout(params, 10000); 
    HttpConnectionParams.setSoTimeout(params, 15000); 
    HttpProtocolParams.setUseExpectContinue(params, true); 

    HttpPost post = new HttpPost(url); 
    post.setParams(params); 
    post.setHeader("soapaction", NAMESPACE.concat("/").concat(METHOD)); 
    post.setHeader("Content-Type", "text/xml; charset-utf8"); 
    try { 
     String request = createRequest(xml); 
     HttpEntity entityToRequest = new StringEntity(request); 
     post.setEntity(entityToRequest); 
     Log.d(TAG, post.toString()); 

     HttpResponse response = client.execute(post); 
     final int status = response.getStatusLine().getStatusCode(); 
     if (HttpStatus.SC_OK == status) { 
      HttpEntity entity = response.getEntity(); 
      String str = EntityUtils.toString(entity); 
      Log.d(TAG, str); 
     } 

    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

在这一请求,我得到一个500服务器代码,所以我想在我的请求,问题。你认为它形成良好吗?

+0

您可以看看Apache Axis2框架,该框架为基于SOAP的Web服务提供了生成器和大量内容。 – 2012-08-16 07:26:39

回答

0

我找到了解决方案。 soupUI和类似的乐器可以帮助你理解你的肥皂使用结构。

+0

您的请求看起来像您想要在端点上发送xsd XML,而不是符合XSD的文档。但是当你发现自己时,soapUI是复制和粘贴XML的好工具。尝试着将soapUI XML粘贴到Java端的txt文件中,这样你就不会有任何关于转义引号等的繁琐操作。然后,Java程序可以在运行时读取txt文件。 – davidfrancis 2012-08-16 10:12:03