关于webservice服务器接收不到Android传递过来的参数的问题

用.NET写了几个简单的接口,在Android上写了个客户端,用的KSOAP2,但发现使用Android通过WebService向服务器发送请求时,服务器接收不到Android传递的参数,通过调试发现:int类型的一直为0,String类型的一直为null。不知何故,或网络查询,或请教大牛,未果。只能换另外一种方法实现了

先是WebService,很简单的一个方法,当然还需要数据库

namespace webs
{
    /// <summary>
    /// WebService1 的摘要说明
    /// </summary>
    [WebService(Namespace = "me")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    //[WebServiceBinding(ConformsTo = WsiProfiles.None)]
    [System.ComponentModel.ToolboxItem(false)]
    // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
    public class WebService1 : System.Web.Services.WebService
    {


        [WebMethod]
        public List<Center> GetClass(String centerCode, String StartDate)
        {
            string strCon = @"server=ECSHIT045;database=mydb;Trusted_Connection=yes";
            SqlConnection MyCon = new SqlConnection(strCon);


            MyCon.Open();
            string strSQL = "select * from center where CenterCode='" + centerCode + "' and Convert(varchar,startDate,120)  like  '" + StartDate + "%'";
            SqlCommand cmd = new SqlCommand(strSQL, MyCon);
            SqlDataReader reader = cmd.ExecuteReader();


            List<center> list = new List<center>();
            while (reader.Read())
            {
                int ID=(Int32)reader["ID"];
                String code=reader["CenterCode"].ToString();
                DateTime date=(DateTime)reader["startDate"];
                String name=reader["CourseName"].ToString();          


                center c = new center();
                c.ID1 = ID;
                c.CenterCode1 = centerCode;
                c.StartDate = date;
                c.CourseName1 = name;
                list.Add(c);
            }


            MyCon.Close();
            return list;
        }
    }
}


这里需要客户端传递两个参数过来

下面是要用到的一些属性

namespace webs
{
    public class center
    {
        private int ID;
        private String CenterCode;
        private DateTime startDate;
        private String CourseName;
		
        public int ID1
        {
            get { return ID; }
            set { ID = value; }
        }
        public String CenterCode1
        {
            get { return CenterCode; }
            set { CenterCode = value; }
        }
        public DateTime StartDate
        {
            get { return startDate; }
            set { startDate = value; }
        }
        public String CourseName1
        {
            get { return CourseName; }
            set { CourseName = value; }
        }  
    }
}

Android客户端
因为没有使用KSOAP2,所以发送的请求需要自己封装

 private  String getRequestStr(String centerCode,String startDate) {

		  StringBuilder sb = new StringBuilder();
		  sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>"
		      + "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "
		      + "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" "
		      + "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
		      + "<soap:Body>    <GetClass xmlns=\"me\">"
		      + "<centerCode>" + centerCode
		      + "</centerCode>  <StartDate>"+startDate
		      +"</StartDate>  </GetClass>"
		      + "</soap:Body></soap:Envelope>");
		  return sb.toString();
		 }
这里需要向服务器传递两个参数
发送请求,获得响应


private static String getResponseXml(String centerCode,String startDate) throws Exception {
	 
	   String soap = getRequestStr(centerCode,startDate);
	   if (soap == null) {
	    return null;
	   }
	   URL url = new URL(URL);
	   URLConnection conn = url.openConnection();
	   conn.setUseCaches(false);
	   conn.setDoInput(true);
	   conn.setDoOutput(true);

	   conn.setRequestProperty("Content-Length", Integer.toString(soap.length()));
	   conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
	   conn.setRequestProperty("SOAPAction",ACTION);

	   OutputStream os = conn.getOutputStream();
	   OutputStreamWriter osw = new OutputStreamWriter(os, "utf-8");
	   osw.write(soap);
	   osw.flush();
	   osw.close();

	   BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
			   StringBuilder sBuilder = new StringBuilder();
			   String line = "";
			   for (line = br.readLine(); line != null; line = br.readLine()) {
			   sBuilder.append(line);
			   System.out.println(sBuilder);
			   }
	   return sBuilder.toString();
	
	 }
解析

public static List<CenterBean> getAll(String centerCode,String startDate){

    	String result = null;
		try {
			result = getResponseXml(centerCode, startDate);
		} catch (Exception e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
	        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
	        DocumentBuilder builder = null;
			try {
				builder = factory.newDocumentBuilder();
			} catch (ParserConfigurationException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	        Document document = null;
			try {
				document = builder.parse(new InputSource(new StringReader(result)));
			} catch (SAXException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			List<InCenterClassBean> list=new ArrayList<InCenterClassBean>();
			
			Element root=document.getDocumentElement();
			 NodeList nodeList=root.getElementsByTagName("center");
		        for (int i = 0; i < nodeList.getLength(); i++) {
					Element childElement1=(Element) nodeList.item(i);
					NodeList child=childElement1.getChildNodes();
					
					CenterBean center=new CenterBean();
					
					 for(int j = 0;j<child.getLength();j++)  
				            {  
				                Node childNode = (Node)child.item(j);  
				                if (childNode.getNodeType()==Node.ELEMENT_NODE)  
				                {  
				                	Element childElement = (Element)childNode;  
			                    String name=childElement.getNodeName();
			                    
			                    if ("ID".equals(childElement.getNodeName()))  
			                    {  
			                    	center.setId(Integer.parseInt(childElement.getFirstChild().getNodeValue()));
			                    }  
			                    else if ("CenterCode".equals(childElement.getNodeName())) {  
			                    	center.setCenterCode(childElement.getFirstChild().getNodeValue()); 
			                    }  
			                    else if ("startDate".equals(childElement.getNodeName())) {  
			                    	center.setStartDate(childElement.getFirstChild().getNodeValue());
			                    }  
			                    else if ("CourseName".equals(childElement.getNodeName())) {  
			                    	center.setCourseName(childElement.getFirstChild().getNodeValue());
			                    }                                                              				                
				          }
					 list.add(center);
			}
		        return list;
    }

最后不要忘了在AndroidManifest文件中加入网络访问的权限

这里为图方便,将请求网络的事件写在主线程中了,建议大家改为多线程


THE END

你可能感兴趣的:(关于webservice服务器接收不到Android传递过来的参数的问题)