2011-07-08 78 views
0

我試圖通過kSOAP調用公共Web服務(w3schools.com/webservices/tempconvert.asmx)(下載並直接包含來自Google的「.jar」)。Android kSOAP網絡服務問題

這裏是我的代碼:

// declarations 

private static final String NAMESPACE = "http://tempuri.org/" ; 
private static final String METHOD_NAME = "CelsiusToFahrenheit"; 
private static final String SOAP_ACTION = "http://tempuri.org/CelsiusToFahrenheit"; 
private static final String URL = "http://216.128.29.26/webservices/tempconvert.asmx"; 

// code 

try 
{ 
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 

    request.addProperty("Celsius", "32"); 
    envelope.setOutputSoapObject(request); 
    androidHttpTransport.call(SOAP_ACTION, envelope); 

    Object result = envelope.getResponse(); 
} 
catch(Exception e) 
{ 
    e.printStackTrace(); 
} 

此外, 「AndroidManifest.xml中」 包括訪問互聯網的權限:

<uses-permission android:name="android.permission.INTERNET"></uses-permission> 

而且,我的AVD可以訪問互聯網(通過試了一下瀏覽器應用)。

有人可以幫我嗎?我一直在嘗試這個工作大約6個小時,而且還在失敗。

謝謝!

+1

有什麼問題?有沒有什麼異常或錯誤? post logcat –

+0

@Balaji:是的。異常發生。這是一個堆棧跟蹤,如果有幫助的話。 http://i54.tinypic.com/2e0vl2r.png – Alex

+0

我仍然有問題,這是迫切。任何人? – Alex

回答

0

不太。我曾嘗試過(嘗試過至少5種不同的方法)。它沒有幫助。這是API版本。我有12個。它沒有工作。我在某處發現kSOAP只能在8以下的環境下工作。去圖:)

我希望每個遇到這個問題的人都會發現這個,之後他們會用12個API釋放太多時間。

+2

這完全錯了。 ksoap2-android在Android 4.0上運行得很好。問題在於你在UI線程上嘗試網絡訪問,就像我在我的回答中所陳述的那樣,Android API框架本身不允許從API級別12開始允許。 –

1

看起來像你在做與我一樣的教程。 http://www.vimeo.com/9633556

好像你缺少envelope.dotNet = true;

+1

你使用kso​​ap2或ksoap2-android?可以從http://code.google.com/p/ksoap2-android/ – GriffiN

+0

下載ksoap2-android謝謝@GriffiN。現在它工作了。在我使用這個http://code.google.com/p/ksoap2-android/wiki/HowToUse?tm=2 ksoap2之前,但它的版本在我的項目中不起作用。但是當我添加你的jar鏈接時,我的項目工作。謝謝。 –

0

我剛剛嘗試了我自己的代碼(它只是在web服務中嘗試使用不同的)與api版本10和ksoap2,它仍然按預期工作。

  private static final String SOAP_ACTION = "http://tempuri.org/CelsiusToFahrenheit"; 
      private static final String METHOD_NAME = "CelsiusToFahrenheit"; 
      private static final String NAMESPACE = "http://tempuri.org/"; 
      private static final String URL = "http://www.w3schools.com/webservices/tempconvert.asmx"; 
      System.out.println("--==Creating SOAP object==--"); 
      SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
      request.addProperty("Celsius", "32"); 
      System.out.println("--==Finished Creating SOAP object==--"); 

      System.out.println("--==Creating SOAP envelope==--"); 
      SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(
        SoapEnvelope.VER11); 
      soapEnvelope.dotNet = true; 
      soapEnvelope.setOutputSoapObject(request); 
      System.out.println("--==Finished Creating SOAP envelope==--"); 

      HttpTransportSE aht = new HttpTransportSE(URL); 
      // aht.debug = true; 

      try { 
       System.out.println("--==Creating SOAP call==--"); 
       aht.call(SOAP_ACTION, soapEnvelope); 
       System.out.println("test"); 

       SoapPrimitive response = (SoapPrimitive) soapEnvelope.getResponse(); 
       System.out.println(response.toString()); 
       tableData.addView(resultSoap); 
       System.out.println("--==Finished Creating SOAP call==--"); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      if (aht.debug == true) { 
       System.out.println(aht.responseDump); 
      } 
+0

還沒有嘗試過與10試了一下,它沒有奏效。嘗試了8,它的工作。嘗試11或12 ... – Alex

+0

順便說一句,我們有保存服務(我只是翻譯w3schools.com到IP,因​​爲我發現一個建議,這可能是我的問題的原因):) – Alex

5

問題是,您正在主線程和API級別12上進行網絡調用,這是不允許的。您只需將ksoap2調用移動到AsyncTask左右即可。任何通過網絡訪問的方式都會出現此問題。這是一個強制嚴格模式檢查。

+0

我正在做的Web服務調用在'AsyncTask'中。但得到期望start_tag .....等等等等......任何建議。 PS:a – iDroid

+0

您需要進行調試以檢查您的響應轉儲是什麼。在ksoap2-android wiki上查找細節。 –

+0

緩存XMLPullParserException後,我的響應轉儲是一個HTML字符串,它具有錯誤描述「緩存訪問被拒絕」。由於它是一個HTML響應而不是SOAP XML響應。所以KSOAP的解析器尋找「XML SOAP響應的開始標記」,並且在那裏沒有找到它,所以觸發了異常「期望的START_TAG ....」 – iDroid

0
package com.soap; 

    import org.ksoap2.SoapEnvelope; 
    import org.ksoap2.serialization.SoapObject; 
    import org.ksoap2.serialization.SoapPrimitive; 
    import org.ksoap2.serialization.SoapSerializationEnvelope; 
    import org.ksoap2.transport.AndroidHttpTransport; 

    import android.app.Activity; 
    import android.os.Bundle; 
    import android.util.Log; 
    import android.widget.TextView; 
    public class SoapsActivity extends Activity { 
    /** Called when the activity is first created. */ 
    private static final String SOAP_ACTION = "http://tempuri.org/CelsiusToFahrenheit"; 
    private static final String METHOD_NAME = "CelsiusToFahrenheit"; 
    private static final String NAMESPACE = "http://tempuri.org/"; 
    private static final String URL = "http://www.w3schools.com/webservices/tempconvert.asmx"; 
    TextView tv; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     tv = (TextView) findViewById(R.id.tvsoap); 
     SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
     request.addProperty("Celsius", "32"); 
     SoapSerializationEnvelope evenlop = new SoapSerializationEnvelope(
       SoapEnvelope.VER11); 
     evenlop.dotNet = true; 
     evenlop.setOutputSoapObject(request); 
     AndroidHttpTransport aht = new AndroidHttpTransport(URL); 
     try { 
      aht.call(SOAP_ACTION, evenlop); 
      SoapPrimitive resultString = (SoapPrimitive) evenlop.getResponse(); 
      tv.setText("ststus :" + resultString.toString()); 
     } catch (Exception e) { 
      System.out.println(e.toString()); 
     } 

    } 

}