2015-09-22 140 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

相关问题