私はWSDLがhttp://srilanka.lk:9080/services/CropServiceProxy?wsdlにあるWebサービスにアクセスしようとしています。 SoapUIを使用してリクエストを送信し、正常に応答しました。Android用KSOAP2は
Android用KSoap2を使用して、私は応答を得ようとしました。しかし、私が得るのはSoapFaultエラーです。コードは以下の通りです。
文字列NAMESPACE = "http://schemas.icta.lk/xsd/crop/handler/v1";
String URL = "http://www.srilanka.lk:9080/services/CropServiceProxy.CropServiceProxyHttpSoap12Endpoint";
String method_name = "getCropDataList";
String SOAP_ACTION = method_name;
SoapObject request = new SoapObject(NAMESPACE, method_name);
String crop_code_str = String.valueOf(code.getText().toString());
System.out.println(crop_code_str);
System.out.println(request.toString());
request.addProperty("code", crop_code_str);
System.out.println(request.getProperty("code").toString());
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12);
envelope.setOutputSoapObject(request);
System.out.println("body out : " + envelope.bodyOut.toString());
HttpTransportSE http_transport = new HttpTransportSE(URL);
try {
http_transport.call(SOAP_ACTION, envelope);
System.out.println(envelope.bodyIn.toString());
} catch (Exception e) {
e.printStackTrace();
answer.setText("error caught");
}
この結果、以下の結果が得られます。
W/System.err( 394): org.xmlpull.v1.XmlPullParserException: expected: START_TAG {http://www.w3.org/2001/12/soap-envelope}Envelope (position:START_TAG <{http://schemas.xmlsoap.org/soap/envelope/}soapenv:Envelope>@1:114 in [email protected])
私はVER11で試しましたが、bodyInとして次のエラーが発生しました。
I/System.out( 365): SoapFault - faultcode: 'soapenv:Server' faultstring: 'org.apache.axis2.databinding.ADBException: Unexpected subelement code' faultactor: 'null' detail: [email protected]
アンドロイドのKsoap2ではこれが問題ですか?次に、AndroidでWebサービスを使用する別の方法がありますか? (SOAPのみ利用可能)
更新:複合型のKvmSerializableインターフェイスを試しました。以下は私のコードです。私はまだ同じエラーが発生します。 http_transport.call行でXMLPullParserエラーがスローされています。
これは、クライアント側での複合型実装です。私はWSDLしか持っていません。
public class CropInfo implements KvmSerializable {
private String name;
private float price;
private String location;
@Override
public Object getProperty(int arg0) {
switch (arg0){
case 0:
return name;
case 1:
return price;
case 2:
return location;
default:
return null;
}
}
@Override
public int getPropertyCount() {
return 3;
}
@Override
public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) {
switch (arg0){
case 0:
arg2.type = PropertyInfo.STRING_CLASS;
arg2.name = "Name";
break;
case 1:
arg2.type = Float.class;
arg2.name = "Price";
break;
case 2:
arg2.type = PropertyInfo.STRING_CLASS;
arg2.name = "Location";
break;
default:
break;
}
}
@Override
public void setProperty(int arg0, Object arg1) {
switch(arg0){
case 0:
name = arg1.toString();
break;
case 1:
price = Float.parseFloat(arg1.toString());
case 2:
location = arg1.toString();
default:
break;
}
}
}
Webサービスの応答にアクセスして解析するための変更されたコード。
文字列NAMESPACE = "http://schemas.icta.lk/xsd/crop/handler/v1/"; 文字列URL = "http://www.srilanka.lk:9080/services/CropServiceProxy.CropServiceProxyHttpSoap12Endpoint"; 文字列method_name = "getCropDataList"; 文字列SOAP_ACTION = "http://schemas.icta.lk/xsd/crop/handler/v1/getCropDataList";
SoapObject soap_request = new SoapObject(NAMESPACE, method_name);
String crop_code_str = String.valueOf(code.getText().toString());
System.out.println(crop_code_str);
System.out.println(soap_request.toString());
soap_request.addProperty("code", crop_code_str);
System.out.println(soap_request.getProperty("code").toString());
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12);
envelope.setOutputSoapObject(soap_request);
envelope.addMapping(NAMESPACE, "cropInfo", CropInfo.class);
//envelope.dotNet=true;
Marshal floatMarshal = new MarshalFloat();
floatMarshal.register(envelope);
System.out.println("body out : " + envelope.bodyOut.toString());
//AndroidHttpTransport http_transport = new AndroidHttpTransport(URL);
HttpTransportSE http_transport = new HttpTransportSE(URL);
try {
//error comes from this call
http_transport.call(SOAP_ACTION, envelope);
Vector<CropInfo> result_array = (Vector<CropInfo>)envelope.getResponse();
if(result_array != null){
for (CropInfo current_crop: result_array){
System.out.println(current_crop.getName());
System.out.println(Float.toString(current_crop.getPrice()));
}
}
} catch (Exception e) {
e.printStackTrace();
answer.setText("error caught");
}
を試してみてください、あなたが持つことができる 出力を与えることができ、各タグの中に独自の名前空間を挿入するtendancyを持っているsoapenv :Body> VersionMismatch SOAP 1.1またはSOAP 1のみ。2つのメッセージが faultstring> soapenv:Fault> soapenv:Body>システムでサポートされています。これがXMLエラーが発生する理由です。しかし、私はSoapUIがサービスがsoapであると言ってVER12を使用しました。 –
Chamila
私はVER11を使用すると、応答として "org.apache.axis2.databinding.ADBException:Unexpected subelement code"を取得します。 – Chamila
soap1.2のサポートは、最新のリリースでのみ向上しました。特に1.2のSoapFaultがサポートされています。最新のリリース - http://code.google.com/p/ksoap2-android/wiki/HowToUse?tm=2から2.5.8を使用してください。 –