2010-12-29 21 views
2

私は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"); 
    } 
+0

を試してみてください、あなたが持つことができる 出力を与えることができ、各タグの中に独自の名前空間を挿入するtendancyを持っているsoapenv :Body> VersionMismatch SOAP 1.1またはSOAP 1のみ。2つのメッセージがシステムでサポートされています。これがXMLエラーが発生する理由です。しかし、私はSoapUIがサービスがsoapであると言ってVER12を使用しました。 – Chamila

+0

私はVER11を使用すると、応答として "org.apache.axis2.databinding.ADBException:Unexpected subelement code"を取得します。 – Chamila

+0

soap1.2のサポートは、最新のリリースでのみ向上しました。特に1.2のSoapFaultがサポートされています。最新のリリース - http://code.google.com/p/ksoap2-android/wiki/HowToUse?tm=2から2.5.8を使用してください。 –

答えて

1

私は、KSoapを使用することの苦労と矛盾について多くのスレッドを読んできました。 DefaultHttpClientクラスを使用してhttp投稿を行い、手動でSOAPヘッダーを作成してレスポンスを解析することができます。

+0

私は今それをやろうとしています。しかし、私はサービスエンドポイントでFileNotFoundExceptionを取得します。上記のエンドポイント12のURLを設定しました(http://www.srilanka.lk:9080/services/CropServiceProxy.CropServiceProxyHttpSoap12Endpoint)。それは正しいURLではないのですか、それともwsdlのURLでなければなりませんか?私はHttpURLConnectionを使用しています。 – Chamila

+1

これは間違いなく道のりです。私は最後の数日間、ksoapを稼働させるのに苦労していました。私はちょうどPostmanを使って5分以内に電話を複製しました。 – rplankenhorn

1

あなたのコードは大丈夫だと思います。

Thirstはあなたのwsdlファイルを見ています。ここではnamspace、actionなどの必要なすべてのデータを見つけることができます。多くの場合、アクションは ""のようなemty文字列です。 私はいつもSoapEnvelope.VER11を選択しますが、通常は問題ありません。 このコードは、複雑なデータが必要な場合はprimitivデータ型と文字列配列でのみ機能し、kvmSerializableインターフェイスを実装する必要があります。

私の悪い英語のために申し訳ありませんが、私はあなたが私の意味を理解することを願っています。以下は役に立つリンクです。

http://www.drdobbs.com/mobility/208800166;jsessionid=2VAK4K4QQ5H3TQE1GHPSKH4ATMY32JVN?pgno=1

+0

こんにちはlx_man、チップのおかげで。私はKvmSerializableを使用し、複合型を実装しました。しかし、私はまだエラーを取得してしまう。最新のコードで質問を更新しました。 – Chamila

+0

あなたはhttp://wsdltoksoap.googlecode.comを見ることができます。これはAndroid互換のJava Webサービスクライアントコードジェネレータです –

0

KSoap私はとしてSOAP応答を<取得しています

envelope.implicitTypes = true; 
関連する問題