2014-11-25 94 views
0

我想要做的是在ASP.NET中创建一个简单的Web服务,并通过该Web服务从MSSQL服务器获取数据,并在我的Android应用程序中使用该数据。作为新手,我已经尝试了这个Helpful的链接。我已经使用了本教程所提出的相同架构。但在我的结果中解析结果(肥皂响应)时出现错误。如下所示。如何从android中的SOAP响应中获取数据?

<?xml version="1.0" encoding="utf-8"?> <soap:Envelope 
> xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
> xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
> <soap:Body><findContactResponse xmlns="http://tempuri.org/" /> 
> </soap:Body> </soap:Envelope> 

和GetPropertyCount()方法返回0,另一方面,arrayindexoutofBound误差未来与索引为0

这是我的活动的代码。我在哪里实施了易于处理的异步任务。

public class MainActivity extends Activity { 

    /** Called when the activity is first created. */ 
    private static final String SOAP_ACTION = "http://tempuri.org/findContact"; 

    private static final String OPERATION_NAME = "findContact";// your webservice web method name 

    private static final String WSDL_TARGET_NAMESPACE = "http://tempuri.org/"; 

    private static final String SOAP_ADDRESS = "http://10.0.2.2:58497/WebService/Service.asmx?wsdl";//"http://127.0.0.1:58497/WebService/Service.asmx"; 

    protected static final String TAG = null; 

    TextView tvData1; 
    EditText edata; 
    Button button; 
    String studentNo; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     tvData1 = (TextView)findViewById(R.id.textView1); 
     edata =(EditText)findViewById(R.id.editText1); 

     button=(Button)findViewById(R.id.button1); 

     button.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 

        studentNo=edata.getText().toString(); 
        new Submit().execute(studentNo); 
      } 
     }); 
    } 

    private class Submit extends AsyncTask<String, Void, Void> { 

     @Override 
     protected void onPreExecute() { 

      super.onPreExecute(); 
     } 

     @Override 
     protected Void doInBackground(String... arg) { 

      // TODO Auto-generated method stub 
      SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE,OPERATION_NAME); 
      PropertyInfo propertyInfo = new PropertyInfo(); 
      propertyInfo.type = PropertyInfo.STRING_CLASS; 
      propertyInfo.name = "eid"; 

      Log.e("studentNo", studentNo); 
      request.addProperty(propertyInfo); 
      request.addProperty("eid", studentNo); 

      SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
      envelope.dotNet = true; 
      envelope.setOutputSoapObject(request); 
      HttpTransportSE httpTransport = new HttpTransportSE(SOAP_ADDRESS); 
      httpTransport.debug = true; 
      try { 

        httpTransport.call(SOAP_ACTION, envelope); 
        Log.e("Dump", httpTransport.responseDump.toString()); 
       SoapObject result=(SoapObject)envelope.bodyIn; 
       if(result!= null){ 

        Log.e("response", result.toString()); 
        //To get the data. 
        System.out.println("********Count : "+ result.getPropertyCount()); 
        String resultData=result.getProperty(0).toString(); 
        Log.e("Found", resultData); 
       } 
       else{ 

        Log.e("Obj", result.toString()); 
       } 
      } 
      catch (Exception exception) { 

       Log.e("Not Found", exception.toString()); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 

      super.onPostExecute(result); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 

     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 
     if (id == R.id.action_settings) { 

      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    /** 
    * A placeholder fragment containing a simple view. 
    */ 
} 

现在任何人都可以告诉我哪里出了问题吗?或者我怎样才能毫无例外地得到我的回应?调试后,我想出了这条线正在创建异常。

String resultData=result.getProperty(0).toString(); 

非常感谢您提供任何帮助。

+0

http://programmingjungle.blogspot.com/2013/05/soap-client-on-android-using-jibx.html?m=1他们要么是疯狂的,要么在Android上找到了一种简单的肥皂方法 – Anthony 2014-11-25 09:33:28

+0

It对我没有多大帮助。我正在寻找在数据解析的情况下发生araayindexOutofBound错误时应该怎么做?或者我需要做些什么来获得从Soap Response @Anthony解析的数据 – user3673503 2014-11-26 06:06:06

回答

0

终于明白了。

这是在增加财产。稍微改变响应解析。

这是完整的代码,为我制定了。

希望它可以帮助别人。

private static final String SOAP_ACTION = "http://tempuri.org/findContact"; 

    private static final String OPERATION_NAME = "findContact";// your webservice web method name 

    private static final String WSDL_TARGET_NAMESPACE = "http://tempuri.org/"; 

    private static final String SOAP_ADDRESS = "http://10.0.2.2:58497/WebService/Service.asmx"; 

    protected static final String TAG = null; 
    private static String fahren; 

    TextView tvData1; 
    EditText edata; 
    Button button; 
    String studentNo; 
    String state; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     tvData1 = (TextView)findViewById(R.id.textView1); 
     edata =(EditText)findViewById(R.id.editText1); 

     button=(Button)findViewById(R.id.button1); 

     button.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       studentNo=edata.getText().toString(); 
       new Submit().execute(studentNo); 
      } 
     }); 
    } 

    private class Submit extends AsyncTask<String, Void, String> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 

     } 

     @Override 
     protected String doInBackground(String... arg) { 
      // TODO Auto-generated method stub 
      SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE,OPERATION_NAME); 
      PropertyInfo propertyInfo = new PropertyInfo(); 
      propertyInfo.type = PropertyInfo.STRING_CLASS; 
      propertyInfo.name = "eid"; 
      propertyInfo.setValue(studentNo); 
      request.addProperty(propertyInfo);//problem was here 

      SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
      envelope.dotNet = true; 
      envelope.setOutputSoapObject(request); 
      HttpTransportSE httpTransport = new HttpTransportSE(SOAP_ADDRESS); 
      httpTransport.debug = true; 
      try{ 
       httpTransport.call(SOAP_ACTION, envelope); 

       Log.e("RequestDump", httpTransport.requestDump.toString()); 
       Log.e("ResponseDump", httpTransport.responseDump.toString()); 

       SoapObject result=(SoapObject)envelope.bodyIn; 
       if(result!= null){ 
        state = result.getProperty(0).toString(); 
        Log.e("Found", state); 
       } 
       else{ 
        Log.e("Obj", result.toString()); 
       } 
      } 
      catch (Exception exception) { 
       Log.e("Exception", exception.toString()); 
      } 
      return state; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      super.onPostExecute(result); 
      tvData1.setText(result); 
     } 
    } 
} 

我已经实现了一个异步任务,以及摆脱对主线程运行时异常。需要正确添加request.addProperty(propertyInfo)。

相关问题