2012-01-06 52 views
0

我正在嘗試編寫一個用於訪問基於SOAP的Web服務的Android代碼。但是由於例外,代碼在SoapObject request = new SoapObject(NAMESPACE,METHOD)中斷了。從Android訪問SOAP Webservics

代碼如下。有人能指出哪裏出了問題。對此問題的任何線索表示讚賞。任何代碼片段都可以與您一樣使用嗎?

package com.demo; 


import org.ksoap2.SoapEnvelope; 
import org.ksoap2.serialization.PropertyInfo; 
import org.ksoap2.serialization.SoapObject; 
import org.ksoap2.serialization.SoapPrimitive; 
import org.ksoap2.serialization.SoapSerializationEnvelope; 
import org.ksoap2.transport.HttpTransportSE; 

import com.demo.R.id; 

import java.net.*; 

import android.app.Activity; 
import android.os.Bundle; 
import android.os.StrictMode; 
import android.view.View; 
import android.widget.TextView; 


public class WebServiceDemoActivity extends Activity { 


    private final String NAMESPACE = "http://tempuri.org"; 
    private final String URL = "http://xxxxx.com/xxx.svc?wsdl"; 
    private final String SOAPACTION = "http://tempuri.org/IServices/getSearchResults"; 
    private final String METHOD = "getSearchResults"; 



    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

    } 

    public void getPropertySearch(View v){ 

     TextView response_tv = (TextView)findViewById(id.ResultText); 

     final TextView input_zip = (TextView)findViewById(id.ZipCode); 
     String zip_value = input_zip.getText().toString(); 

     final TextView min_price = (TextView)findViewById(id.MinPrice); 
     String min_value = input_zip.getText().toString(); 


     final TextView max_price = (TextView)findViewById(id.MaxPrice); 
     String max_value = input_zip.getText().toString(); 


     if(zip_value == null || zip_value.length() == 0) 
     { 
      response_tv.setText("Error! Zip Code cannot be Empty"); 
      return; 
     } 

     if(min_value == null || min_value.length() == 0) 
     { 
      response_tv.setText("Error! Min: Price cannot be Empty"); 
      return; 
     } 

     if(max_value == null || max_value.length() == 0) 
     { 
      response_tv.setText("Error! Max: Price cannot be Empty"); 
      return; 
     } 


     SoapObject request = new SoapObject(NAMESPACE, METHOD); 
     PropertyInfo GetSearchProp = new PropertyInfo(); 
     GetSearchProp.setName("getSearchResults"); 
     GetSearchProp.setValue("zip=19119,price>=1000000,price<=1099000"); 
     GetSearchProp.setType(String.class); 
     request.addProperty(GetSearchProp); 


     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
     envelope.dotNet = true; 
     envelope.setOutputSoapObject(request); 
     HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 
     try 
     { 

      System.out.print("Before SOAP call"); 

      androidHttpTransport.call(SOAPACTION, envelope); 
      System.out.print("After SOAP call and getting Response"); 
      SoapPrimitive response = (SoapPrimitive)envelope.getResponse(); 
      //response_tv.setText("Value is "+ response.toString()); 

      System.out.println(response.toString()); 
      response_tv.setText("SUCCESS"); 
     }catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 


    } 
} 

下面是我得到的例外。

01-06 12:06:09.477: W/System.err(535): android.os.NetworkOnMainThreadException 
01-06 12:06:09.477: W/System.err(535): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) 
01-06 12:06:09.477: W/System.err(535): at java.net.InetAddress.lookupHostByName(InetAddress.java:391) 
01-06 12:06:09.487: W/System.err(535): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) 
01-06 12:06:09.487: W/System.err(535): at java.net.InetAddress.getAllByName(InetAddress.java:220) 
01-06 12:06:09.487: W/System.err(535): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:71) 
01-06 12:06:09.487: W/System.err(535): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50) 
01-06 12:06:09.487: W/System.err(535): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351) 
01-06 12:06:09.487: W/System.err(535): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86) 
01-06 12:06:09.498: W/System.err(535): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 
01-06 12:06:09.498: W/System.err(535): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308) 
01-06 12:06:09.498: W/System.err(535): at libcore.net.http.HttpEngine.connect(HttpEngine.java:303) 
01-06 12:06:09.498: W/System.err(535): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282) 
01-06 12:06:09.508: W/System.err(535): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232) 
01-06 12:06:09.508: W/System.err(535): at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80) 
01-06 12:06:09.508: W/System.err(535): at org.ksoap2.transport.ServiceConnectionSE.connect(ServiceConnectionSE.java:76) 
01-06 12:06:09.508: W/System.err(535): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:152) 
01-06 12:06:09.517: W/System.err(535): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:95) 
01-06 12:06:09.517: W/System.err(535): at com.demo.WebServiceDemoActivity.getPropertySearch(WebServiceDemoActivity.java:91) 
01-06 12:06:09.517: W/System.err(535): at java.lang.reflect.Method.invokeNative(Native Method) 
01-06 12:06:09.517: W/System.err(535): at java.lang.reflect.Method.invoke(Method.java:511) 
01-06 12:06:09.527: W/System.err(535): at android.view.View$1.onClick(View.java:3039) 
01-06 12:06:09.527: W/System.err(535): at android.view.View.performClick(View.java:3511) 
01-06 12:06:09.527: W/System.err(535): at android.view.View$PerformClick.run(View.java:14105) 
01-06 12:06:09.527: W/System.err(535): at android.os.Handler.handleCallback(Handler.java:605) 
01-06 12:06:09.538: W/System.err(535): at android.os.Handler.dispatchMessage(Handler.java:92) 
01-06 12:06:09.538: W/System.err(535): at android.os.Looper.loop(Looper.java:137) 
01-06 12:06:09.538: W/System.err(535): at android.app.ActivityThread.main(ActivityThread.java:4424) 
01-06 12:06:09.547: W/System.err(535): at java.lang.reflect.Method.invokeNative(Native Method) 
01-06 12:06:09.547: W/System.err(535): at java.lang.reflect.Method.invoke(Method.java:511) 
01-06 12:06:09.547: W/System.err(535): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
01-06 12:06:09.547: W/System.err(535): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
01-06 12:06:09.547: W/System.err(535): at dalvik.system.NativeStart.main(Native Method) 
+0

刪除WSDL;現在嘗試。 – himanshu 2012-01-06 06:33:42

+0

什麼是異常,應該發佈logcat。 – 2012-01-06 06:34:04

+0

@ Himanshu-還是一樣的錯誤 – 2012-01-06 06:41:46

回答

0

據我,你應該改變你的SOAP動作

private final String SOAPACTION = "http://tempuri.org/getSearchResults"; 

其因爲

SOAP ACTION=NAMESPACE+METHOD NAME 

由於Strictmode啓用嘗試使用,這可能是它會幫助你出來

+0

我希望這會幫助你輸出 – 2012-01-06 06:48:16

+0

仍然是同樣的問題。 – 2012-01-06 06:52:58

+0

hwere你已經通過你的參數在肥皂請求你必須傳遞參數。 – 2012-01-06 12:00:45

2

由於HoneyComb版本,您不能在主線程內執行HTTP請求。你必須啓動主要的內部輔助線程,並調用裏面的web服務:從行私人最後字符串的URL =「http://xxxxx.com/xxx.svc?wsdl」

public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState);  
    //............... 
    new Thread(new Runnable() 
    { 
     public void run() 
     { 
      androidHttpTransport.call(SOAPACTION, envelope); 
     } 
    }).start(); 
}