2011-09-01 106 views
0

我想用android應用程序打一個web服務。我正在關注哪些我沒有任何想法的例外情況。請幫忙:如何解決Ksoap2中的Soap故障?

09-01 11:21:29.873: WARN/System.err(921): SoapFault - faultcode: 'soapenv:Server' faultstring: 'com.hello.service.DataStore' faultactor: 'null' detail: [email protected] 
09-01 11:21:29.883: WARN/System.err(921):  at org.ksoap2.serialization.SoapSerializationEnvelope.parseBody(SoapSerializationEnvelope.java:112) 
09-01 11:21:29.883: WARN/System.err(921):  at org.ksoap2.SoapEnvelope.parse(SoapEnvelope.java:137) 
09-01 11:21:29.883: WARN/System.err(921):  at org.ksoap2.transport.Transport.parseResponse(Transport.java:63) 
09-01 11:21:29.883: WARN/System.err(921):  at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:100) 
09-01 11:21:29.883: WARN/System.err(921):  at com.example.HelloTestActivity.onCreate(HelloTestActivity.java:64) 
09-01 11:21:29.883: WARN/System.err(921):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
09-01 11:21:29.883: WARN/System.err(921):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
09-01 11:21:29.883: WARN/System.err(921):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
09-01 11:21:29.883: WARN/System.err(921):  at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
09-01 11:21:29.883: WARN/System.err(921):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
09-01 11:21:29.883: WARN/System.err(921):  at android.os.Handler.dispatchMessage(Handler.java:99) 
09-01 11:21:29.883: WARN/System.err(921):  at android.os.Looper.loop(Looper.java:123) 
09-01 11:21:29.894: WARN/System.err(921):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
09-01 11:21:29.894: WARN/System.err(921):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-01 11:21:29.894: WARN/System.err(921):  at java.lang.reflect.Method.invoke(Method.java:521) 
09-01 11:21:29.894: WARN/System.err(921):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
09-01 11:21:29.894: WARN/System.err(921):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
09-01 11:21:29.904: WARN/System.err(921):  at dalvik.system.NativeStart.main(Native Method) 

該請求甚至沒有到達服務器。它只在調用時失敗。以下是我對Web服務調用代碼:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    tv=(TextView)findViewById(R.id.hello); 

    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
    DataStore t=new DataStore("samsung"); 


    PropertyInfo pi = new PropertyInfo(); 
    pi.setName("name"); 
    pi.setValue(t); 
    pi.setType(t.getClass()); 

    request.addProperty(pi);  
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
     envelope.dotNet=true; 
     envelope.setOutputSoapObject(request); 
     envelope.setAddAdornments(false); 
     envelope.implicitTypes=true; 
     envelope.addMapping(NAMESPACE, "DataStore",new DataStore().getClass()); 
     AndroidHttpTransport androidHttpTransport = new AndroidHttpTransport(URL); 
     try{ 
      androidHttpTransport.call(SOAP_ACTION, envelope); 
      SoapObject response=(SoapObject) envelope.getResponse(); 
      String Name = response.getProperty(0).toString(); 
      tv.setText("Response :" + Name); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

} 

的下面是我的java bean:

public class DataStore implements KvmSerializable 
{ 
    private static final String NAMESPACE = "http://service.hello.com"; 
    private String path; 

    public String getPath() { 
     return path; 
    } 

    private void setPath(String path) { 
     this.path = path; 
    } 

    public DataStore(String path) { 

     this.path = path; 
    } 

    public DataStore() { 
     // TODO Auto-generated constructor stub 
    } 

    public Object getProperty(int arg0) { 
     Log.d("KVM","gp"); 

      switch(arg0) 
      { 
      case 0: 
       Log.d("KVM","after"); 
       return path; 

      } 

      return null; 
     } 

     public int getPropertyCount() { 
      Log.d("KVM","gpc"); 
      return 1; 
     } 

     public void getPropertyInfo(int index, Hashtable arg1, PropertyInfo info) { 
      Log.d("KVM","gpi "+index); 
      switch(index) 
      { 
      case 0: 
       info.type = PropertyInfo.STRING_CLASS; 
       info.name = "path"; 
       break; 

      default:break; 
      } 
     } 


     public void setProperty(int index, Object value) { 
      Log.d("KVM","sp"); 
      switch(index) 
      { 
      case 0: 
       path = (String)value; 
       break; 

      default: 
       break; 
      } 
     } 
     public void register(SoapSerializationEnvelope cm) { 
      // TODO Auto-generated method stub 
      Log.d("KVM","register"); 
      cm.addMapping(NAMESPACE, "DataStore", this.getClass()); 
     } 

} 

請幫我解決這個問題。

問候, 拉胡爾

回答

1

如果您的SOAPFault你需要解析用手答案:(您例外

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

,我想您在使用舊版本ksoap2 :(http://code.google.com/p/ksoap2-android/

這給你答案,然後你可以使用薩克斯解析器或其他解析你的答案:

androidHttpTransport.responseDump; 

如果您發現其他方式做這些請告訴我,我將不勝感激。

0

我用下面的方法:

/** 
* Method to retrieve the errorMessage from the given SoapFault. 
* @param soapFault 
* @return String representing the errorMessage found in the given SoapFault. 
*/ 
private static String getSoapErrorMessage (SoapFault soapFault) { 
    String errorMessage; 
    try { 
     Node detailNode = soapFault.detail; 
     Element faultDetailElement = (Element)detailNode.getElement(0).getChild(1); 
     Element errorMessageElement = (Element)faultDetailElement.getChild(0); 
     errorMessage = errorMessageElement.getText(0); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
     errorMessage = "Could not determine soap error."; 
    } 
    return errorMessage; 
} 
0

檢查您的屬性名稱在android系統與Web服務端相同。

例如。

PropertyInfo pi = new PropertyInfo(); 
pi.setName("name"); 
pi.setValue(t); 
pi.setType(t.getClass()); 

您的參數名稱「name」在Web服務方法中可能不同。查看 !

相關問題