2015-09-22 49 views
0

我想開發一個android應用程序可以通過Web服務訪問存儲在sql server數據庫中的值。我的Web服務返回空響應(如anyType {})if它有爭論。不帶參數的Web方法的工作原理fine.This是我的Web服務Asp.Net Web服務返回空響應,如果它有參數

[WebMethod] 
public List<string> getDetails(string dist) 
{ 
    details = new List<string>(); 
    string sel = "select h_Name,h_address,h_contact from hospital_tb where h_district='" + dist + "'"; 
    SqlDataReader dr = db.dataRead(sel); 
    while (dr.Read()) 
    { 
     string name = dr["h_name"].ToString(); 
     string adres = dr["h_address"].ToString(); 
     string contact = dr["h_contact"].ToString(); 
     result = name + ":" + adres + ":" + contact; 
     details.Add(result); 
    } 
    return details; 
} 

Web服務命名空間是:http://hospitalsearch.com/hos

這是我的Android代碼

class Async extends AsyncTask<String, String, String> 
{ 
    @Override 
    protected String doInBackground(String... params) { 
     // TODO Auto-generated method stub 
     request=new SoapObject(NAMESPACE, METHOD); 
     property=new PropertyInfo(); 
     property.setName("district"); 
     property.setValue(dis); 
     Log.d("condition", dis); 

     request.addProperty(property); 
     SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11); 
     envelope.dotNet=true; 
     envelope.bodyOut=request; 
     Log.d("ree", request.toString()); 
     HttpTransportSE transport=new HttpTransportSE(ADDRESS); 
     try { 
      transport.call(ACTION, envelope); 
      //SoapPrimitive response=(SoapPrimitive)envelope.getResponse(); 
      response=(SoapObject)envelope.getResponse(); 
      Log.d("response", response.toString()); 
      if(response!=null) 
      { 
       parseData(response); 
      } 
      else 
      { 
       Log.d("result", "no data"); 
      } 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      res="error"; 
      Log.d("result", res); 
      e.printStackTrace(); 
     } catch (XmlPullParserException e) { 
      // TODO Auto-generated catch block 
      res="error1"; 
      Log.d("result", res); 
      e.printStackTrace(); 
     } 
     return res; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     // TODO Auto-generated method stub 
     ll.setAdapter(adapter); 
    } 
    public void parseData(SoapObject result) 
    { 
     for(int i=0;i<result.getPropertyCount();i++) 
     { 
      if(result.getProperty(i) instanceof SoapObject) 
      { 
       parseData((SoapObject)result.getProperty(i)); 
      } 
      else 
      { 
       PropertyInfo p=new PropertyInfo(); 
       result.getPropertyInfo(i, p); 
       String name= result.getProperty(i).toString(); 
       Log.d("data", name); 
       String[] re=name.split(":"); 
       Model model=new Model(); 
       model.setName(re[0]); 
       model.setAddress(re[1]); 
       model.setContact(re[2]); 
       al.add(model); 
      } 
     } 
    } 
} 

在這裏,我發現,網絡服務不接受參數,我從我的Android代碼傳遞。我也記錄我的請求:Log.d(「request」,request.toString());它顯示getDetails {區= AAAA}。

+0

謹防SQL禁令http://stackoverflow.com/questions/332365/how-does-the-sql-injection-from-the-bobby-的tables-xkcd-comic-work –

回答

0

1)如果您需要創建其他操作名稱,請創建工作人員,更改SoapRequest類。

public abstract class SoapWorker extends AsyncTask<SoapWorker.SoapRequest,Void,Object> { 

public static class SoapRequest{ 

    private LinkedHashMap<String,Object> params; 
    private String methodName; 
    private String namespace; 
    private String actionName; 
    private String url; 
    public SoapRequest(String url, String methodName,String namespace){ 
     this.methodName = methodName; 
     this.params = new LinkedHashMap<>(); 
     this.namespace=namespace; 
     this.actionName=this.namespace + "IService/" + methodName; 
     this.url=url; 
    } 
    public void addParam(String key,Object value){ 
     this.params.put(key,value); 
    } 
} 

@Override 
protected Object doInBackground(SoapRequest... inputs) { 
      SoapRequest input=inputs [0]; 

    try { 
     SoapObject request = new SoapObject(input.namespace, input.methodName); 
     for(Map.Entry<String, Object> entry : input.params.entrySet()){ 
      request.addProperty(entry.getKey(),entry.getValue()); 
     } 
     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
     envelope.dotNet = true; 
     envelope.setOutputSoapObject(request); 
     HttpTransportSE androidHttpTransport = new HttpTransportSE(input.url); 
     androidHttpTransport.call(input.actionName, envelope); 
     input.params.clear(); 

     return parseResponse(envelope.getResponse()); 
    } catch (Exception e) { 
     Log.e("SoapWorker", "error " + e); 
     return e; 
    } 

} 

@WorkerThread 
public abstract Object parseResponse(Object response); 


} 

2)提出請求:

SoapWorker.SoapRequest request = new SoapWorker.SoapRequest(URL,METHOD,NAMESPACE); 
    request.addParam(param1,value1); 
    ... 
    request.addParam(paramN, valueN); 
    //for example: 
    //request.addParam("district", dis); 


    SoapWorker worker = new SoapWorker(){ 
     @Override 
     public Object parseResponse(Object response) { 
      //parse and return results 
      //Log your response to see what you get from server 
      return result; 
     } 

     @Override 
     protected void onPostExecute(Object o) { 
      super.onPostExecute(o); 
      //update your model on UI 
     } 
    }; 

    worker.execute(request); 
+0

爲什麼你要在一個抽象類中創建一個靜態類? – Anupama

+0

您可以在分隔符文件中創建SoapRequest類。如果這將位於同一個文件中,則只顯示用法。像你想要的那樣:) –

+0

先生,當我在doInBackground中更改參數時出現錯誤 – Anupama

相關問題