在android中调用webservice的步骤:
一、使用的工具
vs2015 sqlserver2008r2 eclipse genymotion
二、在sqlservser中创建一个数据库
1、这里我创建了一个"Demo"数据库,"Cno"设置为主键并且标识为自动增长,另外在登录sqlserver的时候使用window身份验证,如果使用sqlserver身份验证的话,最后在android中连接发布的服务可能连接不上而且不报错,所以使用window身份验证登录sql数据库。
三、在vs2015中创建webservice
1、新建→项目→在左边模版中选到web一栏→ASP.NET Web应用程序,然后设置项目名称和路径,建好项目之后,右键添加→新建项→Web服务(ASMX),创建webservice1,再右键项目添加→类→DBOperaton。
webservice的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
namespace Demozuixin
{
/// <summary>
/// WebService1 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。
// [System.Web.Script.Services.ScriptService]
public class WebService1 : System.Web.Services.WebService
{
DBOperation dbOperation = new DBOperation();
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
[WebMethod(Description = "获取所有的信息")]
public string[] selectAllCargoInfor()
{
return dbOperation.selectAllCargoInfor().ToArray();
}
[WebMethod(Description = "增加一条信息")]
public bool insertCargoInfo(string Cname, string Cnum)
{
return dbOperation.insertCargoInfo(Cname, Cnum);
}
[WebMethod(Description = "删除一条信息")]
public bool deleteCargoInfo(string Cno)
{
return dbOperation.deleteCargoInfo(Cno);
}
}
}
DBOperation的代码:
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
namespace Demozuixin
{
/// <summary>
/// 一个操作数据库的类,所有对SQLServer的操作都写在这个类中,使用的时候实例化一个然后直接调用就可以
/// </summary>
public class DBOperation : IDisposable
{
public static SqlConnection sqlCon; //用于连接数据库
//将下面的引号之间的内容换成上面记录下的属性中的连接字符串
private string ConServerStr = @"Data Source=home;Initial Catalog=Demo;Persist Security Info=True;User ID=sa;Password=123";
//默认构造函数
public DBOperation()
{
if (sqlCon == null)
{
sqlCon = new SqlConnection();
sqlCon.ConnectionString = ConServerStr;
sqlCon.Open();
}
}
//关闭/销毁函数,相当于Close()
public void Dispose()
{
if (sqlCon != null)
{
sqlCon.Close();
sqlCon = null;
}
}
//获取一个表的行数
public int getnum()
{
int result = new int();
try
{
string sql = "SELECT COUNT (Cno) FROM Demo";
SqlCommand cmd = new SqlCommand(sql, sqlCon);
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
result = (int)reader[0];
}
reader.Close();
cmd.Dispose();
}
catch (Exception)
{
}
return result + 1;
}
/// <summary>
/// 获取所有货物的信息
/// </summary>
/// <returns>所有货物信息</returns>
public List<string> selectAllCargoInfor()
{
List<string> list = new List<string>();
try
{
string sql = "select * from Demo";
SqlCommand cmd = new SqlCommand(sql, sqlCon);
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
//将结果集信息添加到返回向量中
list.Add(reader[0].ToString());
list.Add(reader[1].ToString());
list.Add(reader[2].ToString());
}
reader.Close();
cmd.Dispose();
}
catch (Exception)
{
}
return list;
}
/// <summary>
/// 增加一条货物信息
/// </summary>
/// <param name="Cname">货物名称</param>
/// <param name="Cnum">货物数量</param>
public bool insertCargoInfo(string Cname, string Cnum)
{
try
{
string sql = "insert into Demo(Cname,Cnum) values ('" + Cname + "','" + Cnum + "')";
SqlCommand cmd = new SqlCommand(sql, sqlCon);
cmd.ExecuteNonQuery();
cmd.Dispose();
return true;
}
catch (Exception)
{
return false;
}
}
/// <summary>
/// 删除一条货物信息
/// </summary>
/// <param name="Cno">货物编号</param>
public bool deleteCargoInfo(string Cno)
{
try
{
string sql = "delete from Demo where Cno=" + Cno;
SqlCommand cmd = new SqlCommand(sql, sqlCon);
cmd.ExecuteNonQuery();
cmd.Dispose();
return true;
}
catch (Exception)
{
return false;
}
}
}
}
2、在webservice这个项目中新建好服务和类之后,就可以进行运行调试,在调试过程中可能出现的问题:
(1)、错误403.14,这个错误的解决方法:去项目文件下去找一个.vs文件这个文件可能是隐藏的需要显示隐藏文件,打开这个文件之后里面有个config文件,打开该文件并且打开里面的applicationhost.config文件,修改里面的代码<directoryBrowse enabled="false" /> 改为<directoryBrowse enabled="true" />就可以了。如果遇到"该 XML 文件并未包含任何关联的样式信息,文档书显示如下"这样的问题可能是版本的原因,使用vs2010运行同样的webservice就会出现上面的问题,但是在vs2015中运行的时候就不会出现问题,可以很好的运行。
3、运行之后没有问题,就可以进行发布服务了,停止调试,右键项目→发布,在配置文件中选择自定义,然后随便输入一个好记的配置文件的名字就可以,连接中选择"file system",路径选择项目所在的路径就可以,然后下面的设置和预览就可以不用问了,直接跳过就可以了,然后点发布。
4、在vs2015中显示发布成功后,使用window+r输入inetmgr打开iis管理器,然后右键"网站",添加网站,在弹出的窗口中,网站名称可以写自己的项目名称,物理路径是自己刚才发布服务的那个路径,然后点"连接为"→"特定用户"→设置→用户名(就是打开电脑时的那个用户名和密码),输入完成后点"测试设置'如果都是绿色说明没有问题,不是绿色的时候还没有遇到过,ip地址就是自己计算的ip地址,获取ip地址的方法:window+r输入cmd打开dos命令窗口,我是win8的系统,所以使用cd ..退出当前所在目录,然后使用cd 进入Windows 在cd 进入System32然后输入"ipconfig'获得自己电脑的ip地址,然后上面的ip地址就选择和自己电脑ip地址一样的就可以了。
5、完成网站的创建之后去右边的功能栏中找到"编辑权限"然后把里面的"组或用户名"都设置为完全控制,然后点击"目录浏览"和"默认文档"在找到右边的功能栏重新启动即可,如果没有"目录浏览"和"默认文档",就去自己的控制面板中找到"程序"然后"启用或关闭windows功能"中把"Internet Information Services"下面所有的东西都打上勾(所有的)。点击网站浏览下面的那个地址,然后就可以在浏览器中打开刚才发布的服务了,如果还是出现错误403.14,就把上面步骤中的<directoryBrowse enabled="true" />语句复制到web.config文件中的</system.webServer>上面就可以,如果还是出现错误403.14那么就右键刚才新建的网站,添加"虚拟目录"路径选择刚才发布服务的路径,然后找到"目录浏览'启动目录浏览。
6、如果出现错误500.19,那么就双击新建网站上面的"应用程序池",点击右边的添加应用程序池→输入一个好记的名字,然后.NET CLR版本选择2.0,创建好之后右键刚才建好网站→管理网站→高级设置,然后把应用程序池改成刚才新建的那个应用程序池。这样应该就可以在浏览器中打开自己发布的服务了,把浏览器中的端口号复制下来。
四、在eclipse中创建android程序:
以下是链接webservices的android程序代码,连接完webservice之后还需要将其获取的内容在程序中使用,HttpConnSoap类是连接webservice的类,DBUtil是操作数据库的类,也就是使用HttpConnSOAP类获取内容的类。
HttpConnSoap类:
package ConSQLServer;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
public class HttpConnSoap {
public ArrayList<String> GetWebServer(String MethodName, ArrayList<String> Parameters, ArrayList<String> ParValues)
{
ArrayList<String> Values = new ArrayList<String>();
//在真机中测试填写电脑的IP地址
String ServerUrl = "";
String soapAction = "\"http://tempuri.org/" + MethodName + "\"";
String soap = "<?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 />";
String s1, s2, s3, s4 = "";
s4 = "<" + MethodName + " xmlns=\"http://tempuri.org/\">";
for (int i = 0; i < Parameters.size(); i++)
{
s1 = Parameters.get(i).toString();
s2 = ParValues.get(i).toString();
s3 = "<" + s1 + ">" + s2 + "</" + s1 + ">";
s4 = s4 + s3;
}
s4 = s4 + "</" + MethodName + ">";
String s5 = "</soap:Envelope>";
String requestData = soap + s4 + s5;
try
{
URL url = new URL(ServerUrl);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
byte[] bytes = requestData.getBytes("utf-8");
con.setDoInput(true);
con.setDoOutput(true);
con.setUseCaches(false);
con.setConnectTimeout(6000);
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "text/xml;charset=utf-8");
con.setRequestProperty("SOAPAction", soapAction);
con.setRequestProperty("Content-Length", "" + bytes.length);
OutputStream outStream = con.getOutputStream();
outStream.write(bytes);
outStream.flush();
outStream.close();
InputStream inStream = con.getInputStream();
Values = inputStreamtovaluelist(inStream, MethodName);
return Values;
}
catch (Exception e)
{
return null;
}
}
public ArrayList<String> inputStreamtovaluelist(InputStream in, String MonthsName) throws IOException {
StringBuffer out = new StringBuffer();
String s1 = "";
byte[] b = new byte[4096000];
ArrayList<String> Values = new ArrayList<String>();
Values.clear();
for (int n; (n = in.read(b)) != -1;) {
s1 = new String(b, 0, n);
out.append(s1);
}
System.out.println(out);
s1 = out.toString();
String[] s13 = s1.split("><");
String ifString = MonthsName + "Result";
String ifres = MonthsName + "Response";
//String ifString = MonthsName;
String TS = "";
String vs = "";
Boolean getValueBoolean = false;
for (int i = 0; i < s13.length; i++) {
TS = s13[i];
System.out.println(TS + "TS前面表示TS");
int j, k, l;
j = TS.indexOf(ifString);
k = TS.lastIndexOf(ifString);
if(TS.equals("/"+ifString))
{
getValueBoolean = false;
return Values;
}
else
{
if(s13[i+1].equals("/" + ifres))
{
getValueBoolean = false;
return Values;
}
}
if (j >= 0) {
System.out.println(j+"j等于前面的**************");
System.out.println(k+"k等于前面的************");
if (getValueBoolean == false) {
getValueBoolean = true;
} else {
}
if ((j >= 0) && (k > j)) {
System.out.println("FFF" + TS.lastIndexOf("/" + ifString));
//System.out.println(TS);
l = ifString.length() + 1;
vs = TS.substring(j + l, k - 2);
//System.out.println("fff"+vs);
Values.add(vs);
System.out.println("退出" + vs);
getValueBoolean = false;
return Values;
}
}
if (TS.lastIndexOf("/" + ifString) >= 0) {
getValueBoolean = false;
return Values;
}
if ((getValueBoolean) && (TS.lastIndexOf("/" + ifString) < 0) && (j < 0)) {
k = TS.length();
System.out.println(TS);
vs = TS.substring(7, k - 8);
System.out.println("fFFFFFFFFFFFFFFFFFFFFFFFFFF"+vs);
Values.add(vs);
}
}
return Values;
}
}
DBUtil类:
package ConSQLServer;
import android.os.Handler;
import android.os.Message;
import java.util.ArrayList;
public class DBUtil {
private ArrayList<String> arrayList = new ArrayList<String>();
private ArrayList<String> brrayList = new ArrayList<String>();
private ArrayList<String> crrayList = new ArrayList<String>();
private String pass;
private HttpConnSoap Soap = new HttpConnSoap();
//获取HTTPConnSOAP类中的内容
public void getTask(final Handler myhandler, String tdygh, String kqzl) {
arrayList.clear();
brrayList.clear();
crrayList.clear();
arrayList.add(""); //数据库中的表头的关键字
arrayList.add("");
brrayList.add();
brrayList.add();
new Thread(){
public void run(){
try {
crrayList = Soap.GetWebServer("webservices中的操作数据库的方法名", arrayList, brrayList);
System.out.println(crrayList.size()+"*********************");
Message msg = new Message();
msg.what = 0x123;
msg.obj = crrayList;
myhandler.sendMessage(msg);
}
catch (Exception e)
{
}
}
}.start();
}
}