在Android中调用webservice的相关问题

  在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();
    }

}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值