Androidのwebservice
にはKsoap2
経由でAndroidにアクセスしようとしています。HttpTransportSE requestDumpはNullPointerExceptionを返します
SoapObject
が作成されます。bodyOut
のS.O.Pが目的の文字列を出力します。しかし、HttpTransportSE
オブジェクトのrequestDump
を作成して呼び出しを行うと、NullPointerException
が発生します。つまり、移送オブジェクトはnullです。これはどうしたらできますか?
Webサービスは、このサービスはSOAPUIと非常によく動作しますhttp://srilanka.lk:9080/services/CropServiceProxy?wsdl
です。
SOAPUI要求:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:v1="http://schemas.icta.lk/xsd/crop/handler/v1/">
<soap:Header/>
<soap:Body>
<v1:getCropDataList>
<v1:code>ABK</v1:code>
</v1:getCropDataList>
</soap:Body>
</soap:Envelope>
SOAPUI応答:
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
<soapenv:Body>
<ns1:getCropDataListResponse xmlns:ns1="http://schemas.icta.lk/xsd/crop/handler/v1/">
<ns1:cropInfo>
<ns1:name>Ambul Kesel</ns1:name>
<ns1:price>35.0</ns1:price>
<ns1:location>Dambulla</ns1:location>
</ns1:cropInfo>
<ns1:cropInfo>
<ns1:name>Ambul Kesel</ns1:name>
<ns1:price>40.0</ns1:price>
<ns1:location>Dambulla</ns1:location>
</ns1:cropInfo>
</ns1:getCropDataListResponse>
</soapenv:Body>
</soapenv:Envelope>
クライアント側複合型KvmSerializable
実装:
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サービスコール:
public void btnOnClick(View v){
String NAMESPACE = "http://schemas.icta.lk/xsd/crop/handler/v1/";
String URL = "http://220.247.225.202:9080/services/CropServiceProxy.CropServiceProxyHttpSoap12Endpoint";
String method_name = "getCropDataList";
String SOAP_ACTION = "http://schemas.icta.lk/xsd/crop/handler/v1/getCropDataList";
SoapObject soap_request = new SoapObject(NAMESPACE, method_name);
soap_request.addProperty("code", "ABK");
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 {
//NullPointerException HERE
System.out.println(http_transport.requestDump);
http_transport.call(SOAP_ACTION, envelope);
//because we should expect a vector, two kinds of prices are given
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");
//System.out.println(http_transport.responseDump);
}
// String result_string[] = (String[])result;
//answer.setText("returned");
}
誰もがこれを説明できますか?
おかげでダニエル。私は注文が間違っている。あなたが提案した修正を行い、呼び出しメソッドでXMLPullParserエラーが発生しました。私はhttp://stackoverflow.com/questions/4557180/ksoap2-for-android-givesでそれに苦しんでいます。 – Chamila
@Daniel dude私の心の底からあなたを愛しています** _ _あなたはこれらの小さなものについての情報を??私は別の[質問](http://stackoverflow.com/q/11048426/1434372)に尋ねました。その答えは@chamilaが持っていた問題に私を導いてくれました。回答者でさえhttpTransport .debug = true; '...うわー、私は** 2時間** ** 2 **のためにそれにこだわっていた今、本当に幸せです。私の_long_コメントをお寄せください。もう一度**ありがとう**! – Shark