用.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; } } } }
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文件中加入网络访问的权限
这里为图方便,将请求网络的事件写在主线程中了,建议大家改为多线程