2012-09-28 97 views
1

屬性以KSOAP2我可以生成一個SOAP信封內這個XML:上的xmlns設置KSOAP2前綴只

<v:Envelope 
    xmlns:i="http://www.w3.org/1999/XMLSchema-instance" 
    xmlns:d="http://www.w3.org/1999/XMLSchema" 
    xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:v="http://schemas.xmlsoap.org/soap/envelope/"> 
    <v:Header /> 
    <v:Body> 
     <ApplyItem xmlns="http://www.myurl.com/"> 
      <Item type="User" action="get" select="login_name"/> 
     </ApplyItem> 
    </v:Body> 
</v:Envelope> 

我可以通過設置envelope.dotNet = FALSE得到這個XML;

<v:Envelope 
    xmlns:i="http://www.w3.org/1999/XMLSchema-instance" 
    xmlns:d="http://www.w3.org/1999/XMLSchema" 
    xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:v="http://schemas.xmlsoap.org/soap/envelope/"> 
    <v:Header /> 
    <v:Body> 
     <n0:ApplyItem xmlns:n0="http://www.myurl.com/"> 
      <n0:Item type="User" action="get" select="login_name"/> 
     </n0:ApplyItem> 
    </v:Body> 
</v:Envelope> 

什麼我需要做的,所以我得到了相同的XML與「N0」前綴只在xmlns屬性這樣

<ApplyItem xmlns:n0="http://www.myurl.com/"> 
    <Item type="User" action="get" select="login_name" /> 
</ApplyItem> 

我的代碼如下

public void TestWebService() { 
/*xmlVersionTag = ""; 
* NAMESPACE = "http://www.myurl.com/"; 
* SOAPaction = "ApplyItem"; 
* MYSERVER = "http://myServer/webservice.aspx"; 
* DATABASE = "dbName"; 
* AUTHUSER = "admin"; 
* AUTHPASSWORD = "pwd"; */ 
SoapObject request = new SoapObject(NAMESPACE, SOAPaction); 

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
              SoapEnvelope.VER11); 
envelope.dotNet = true; 
envelope.setAddAdornments(false); 
envelope.implicitTypes = true; 
envelope.addMapping(null, "Item", new String().getClass()); 

SoapObject aml = new SoapObject(NAMESPACE, "Item"); 
aml.addAttribute("type", "User"); 
aml.addAttribute("action", "get"); 
aml.addAttribute("select", "login_name"); 
request.addSoapObject(aml); 
envelope.setOutputSoapObject(request); 

HttpClient client = new DefaultHttpClient(); 

try { 
    callWS(client, MYSERVER, SOAPaction, envelope); 
    SoapPrimitive response = (SoapPrimitive) envelope.getResponse(); 
    Log.i("Webservice Output", response.toString()); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
return; 
} 

CallWS使用HttpClient使用Http標頭進行連接併發送請求來自肥皂信封的數據並將響應解析回信封輸入。

下面的代碼的一部分。

public void callAras(HttpClient httpClient, 
     String url, String soapAction, SoapEnvelope envelope) 
     throws IOException, XmlPullParserException { 
if (soapAction == null) { 
    soapAction = "\"\""; 
} 
byte[] requestData = createRequestData(envelope); 
String requestDump = new String(requestData); 

HttpPost method = new HttpPost(url); 

method.addHeader("SOAPAction", soapAction); 
method.addHeader("AUTHUSER", AUTHUSER); 
method.addHeader("AUTHPASSWORD", AUTHPASSWORD); 
method.addHeader("DATABASE", DATABASE); 

HttpEntity entity = new ByteArrayEntity(requestData); 
method.setEntity(entity); 
HttpResponse response = httpClient.execute(method); 
InputStream inputStream = response.getEntity().getContent(); 
parseResponse(envelope, inputStream); 

inputStream.close(); 
} 

故障代碼,我得到的是:

SOAP-ENV:Server.TagItemIsNotFoundInRequestException 
There is no tag <Item> in request. 

回答

0

夫婦的事情1請求XML與Web服務的工作如下。請注意,從Item元素中刪除了'n0'前綴。

<v:Envelope 
    xmlns:i="http://www.w3.org/1999/XMLSchema-instance" 
    xmlns:d="http://www.w3.org/1999/XMLSchema" 
    xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:v="http://schemas.xmlsoap.org/soap/envelope/"> 
    <v:Header /> 
    <v:Body> 
     <n0:ApplyItem xmlns:n0="http://www.myurl.com/"> 
      <Item type="User" action="get" select="login_name"/> 
     </n0:ApplyItem> 
    </v:Body> 
</v:Envelope 

我犯的錯誤是使用SoapObject來定義Item元素,而不是使用SoapPrimitive類來定義它。代碼更正低於:

envelope.dotNet = false; 
envelope.setAddAdornments(false); 
envelope.implicitTypes = true; 

SoapPrimitive amlItem = new SoapPrimitive(NAMESPACE, "Item", ""); 
amlItem.addAttribute("type", "User"); 
amlItem.addAttribute("action", "get"); 
amlItem.addAttribute("select", "login_name"); 
request.addProperty("Item", amlItem); 
envelope.setOutputSoapObject(request); 

一旦請求工作,我需要在響應中投從

SoapPrimitive response = (SoapPrimitive) envelope.getResponse(); 

改變以下處理「anytype類型」通過KSOAP返回。

Object response = (Object) envelope.getResponse();