问题
I have webservice that has more than one method. I use firefox soaclient plugin for test them. All methods work properly. These are normal until now. I wrote library on android for call these .net webservice. I have methods, first one prepares envelop, the other one calls method. All methods except one work with these way. I get prepared envelop from my lib for method that doesn't work and use this envelope on firefox soap client, it returns me response in correct way. My own method that calls web service doesn't work wrong, just return empty result. What could be the error?

private void createEnvelope() {
// Her bir parametrenin kalıbı
String params = "<%s>%s</%s>";
// Her parametre kalıbına değer atandığında geçici olarak tutulan string
String paramsTemp = "";
// Hazırlanan tüm parametrelerin tutulduğu değişken
String paramsAll = "";
// Parametreler ekleniyor
for (int i = 0; i < parameterKeys.size(); i++) {
paramsTemp = String.format(params, parameterKeys.get(i),
parameterValues.get(i), parameterKeys.get(i));
paramsAll += paramsTemp;
}
// soap mesajını hazılıyoruz
String soapTemplate = "<?xml version=\"%s\" encoding=\"%s\"?>"
+ "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
+ "<soap:Body>" + "<%s xmlns=\"%s\">" + "%s" + "</%s>"
+ "</soap:Body>" + "</soap:Envelope>";
envelope = String.format(soapTemplate, version, charEncoding,
methodName, namespace, paramsAll, methodName);
Logger.log("request:" + envelope);
}
public String callWebService() {
createEnvelope();
// request parameters
HttpParams params = httpClient.getParams();
HttpConnectionParams.setConnectionTimeout(params, connectionTimeOut);
HttpConnectionParams.setSoTimeout(params, soTimeOut);
// set parameter
HttpProtocolParams.setUseExpectContinue(httpClient.getParams(), true);
// POST the envelope
HttpPost httppost = new HttpPost(url);
// add headers
httppost.setHeader("SOAPAction", soapAction);
httppost.setHeader("Content-Type", contentType);
try {
// the entity holds the request
HttpEntity entity = new StringEntity(envelope);
httppost.setEntity(entity);
// Response handler
ResponseHandler<String> rh = new ResponseHandler<String>() {
// invoked when client receives response
public String handleResponse(HttpResponse responseTemp)
throws ClientProtocolException, IOException {
// get response entity
HttpEntity entity = responseTemp.getEntity();
StatusLine statusLine = responseTemp.getStatusLine();
// read the response as byte array
StringBuffer out = new StringBuffer();
byte[] b = EntityUtils.toByteArray(entity);
// write the response byte array to a string buffer
out.append(new String(b, 0, b.length));
return out.toString();
}
};
response = httpClient.execute(httppost, rh);
} catch (Exception e) {
Log.v("Soap Service Exception:", e.toString());
}
// close the connection
httpClient.getConnectionManager().shutdown();
return response;
}
EDIT
Request template on logcat:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<Method_Name xmlns="url">
<param1>12345</param1>
<param2>ügıtç</param2>
<param3>qwert</param3>
</Method_Name>
</soap:Body>
</soap:Envelope>
response template on logcat
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<Method_Name_Response xmlns="url">
<Method_Name_Result>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="NewDataSet">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Temp">
<xs:complexType>
<xs:sequence>
<xs:element name="response1" type="xs:long" minOccurs="0" />
<xs:element name="response2" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<diffgr:diffgram xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" />
</Method_Name_Result>
</Method_Name_Response>
</soap:Body>
</soap:Envelope>
response template on firefox plugin with same envelope
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<Method_Name_Response xmlns="url">
<Method_Name_Result>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="NewDataSet">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Temp">
<xs:complexType>
<xs:sequence>
<xs:element name="response1" type="xs:long" minOccurs="0" />
<xs:element name="response2" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<diffgr:diffgram xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<NewDataSet xmlns="">
<Temp diffgr:id="Temp1" msdata:rowOrder="0">
<response1>123456789</response1>
<response2>Android</response2>
</Temp>
</NewDataSet>
</diffgr:diffgram>
</Method_Name_Result>
</Method_Name_Response>
</soap:Body>
</soap:Envelope>
回答1:
I found my problem, Turkish characters causes the error. When I use "ü" it causes error, when I don't use it, it works perfect.
来源:https://stackoverflow.com/questions/14080334/why-doesnt-webservice-work-manually