android使用http与后台服务器交互(一)get

servlet 同时被 2 个专栏收录
3 篇文章 0 订阅
3 篇文章 0 订阅

前言&废话:由于自己没学过怎么搭建一个android后台的服务器,之前一直都用TCP偷偷混过去,最近学校搞项目实训,组长指定要用http与后台交互,这次混不过去了...

首先讲一讲http与TCP的区别。我们都知道,TCP是基于连接的服务,因此传输之前我们需要先建立一个连接,而且要传输就得保证连接不能断...而我们日常上手机app的连接往往都是时连时不连的,一直保持连接似乎不太好,那么http相比之的优点就是,需要时我只需要发送一个http请求,请求完就没连接了,这是大多数app的比较常见的情况。

首先讲一讲需要用到的工具  android开发使用的是android studio,服务器要有JAVA运行环境。后台使用[eclipse Jee]+tomcat,注意这里要用j2ee版本的eclipse,这是专门用于web开发的,当然也可以用付费版的Myeclipse...这里不会详细告诉大家tomcat怎么使用,但是会教大家到“能用”的程度。

另外请大家自行去了解get和post方法。

前面的博客中,我们已经讲解了如何使用tomcat简单搭建一个servlet,不明白的可以先去看一下

https://blog.csdn.net/ppsiri/article/details/93460932

好,下面我们主要讲一下使用get方法发送请求,get方法是将请求的字段直接追加在url后面。比如 testServlet/login?username=tom&paswword=123

现在我们打开我们的网页,servlet给出的显示是这样的

这里的输入是通过

 response.getWriter()来写出的,同时,服务器也可以通过这个方法来给客户端传回消息。

网页是通过调用servlet的方法来实现B-S的交互的,这里我们不写网页,直接通过url调用doGet方法试一下(用url调用doget在最后面。。。)。

这里是客户端用url进行调用

将url中的请求解析出来:

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
		String name =request.getParameter("username");
		String pwd=request.getParameter("password");
		System.out.println("--------name:"+name);
		System.out.println("--------pwd:"+pwd);
	    
	}

来看一下android客户端的相应代码部分,这里只贴出了登录处理部分的,而且不是登陆验证,只是看看服务器是否收到相应消息。

    public static boolean Login(String getname, String pwd) throws Exception {

        String path = "http://192.168.43.184:8080/blog/TestServlet";

        Map<String, String> params = new HashMap<String, String>();//将数据放在map里,便于取出传递
        params.put("username", getname);
        params.put("password", pwd);

        return sendGETRequest(path, params, "UTF-8");
    }

    private static boolean sendGETRequest(String path,
                                          Map<String, String> params, String encoding) throws Exception {

        StringBuilder sb = new StringBuilder(path);
        if (params != null && !params.isEmpty()) {
            sb.append("?");
            for (Map.Entry<String, String> entry : params.entrySet()) {
               //将map数据取出并附在url后面
                sb.append(entry.getKey()).append("=");
                sb.append(URLEncoder.encode(entry.getValue(), encoding));
                sb.append("&");
            }
            sb.deleteCharAt(sb.length() - 1);
        }

        HttpURLConnection connection = (HttpURLConnection) new URL(
                sb.toString()).openConnection();
        Log.d(TAG, "sendGETRequest: "+sb.toString());//在日志里看一下我们创建完的链接是什么样的
        connection.setConnectTimeout(5000);
        connection.setRequestMethod("GET");
        if (connection.getResponseCode() == 200) {
//            InputStream inputStream = connection.getInputStream();
//            int len = 0;
//            ByteArrayOutputStream outStream2 = new ByteArrayOutputStream();
//            byte[] data = new byte[1024];
//            while ((len = inputStream.read(data)) != -1) {
//                outStream2.write(data, 0, len);
//            }
//            outStream2.close();
//            inputStream.close();
//            String responseStr = new String(outStream2.toByteArray());
//            Log.v(TAG, "data = " + responseStr);

            return true;
        }

        return false;
    }

客户端和服务器的字段要都一致,比如都是username

另外android要申请网络权限

然后看一下运行效果,(注意重启一下tomcat)这是AS里logcat的打印,也就是我们的请求,可以看到我们的信息都没附在了连接后面。

 而在服务器端我们成功收到了请求

下面我们尝试在收到请求后,给客户端回复一下 

服务器修改

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
		String name =request.getParameter("username");
		String pwd=request.getParameter("password");
		System.out.println("--------name:"+name);
		System.out.println("--------pwd:"+pwd);
		response.getWriter().write(" I get your name is "+name+" and "+"pwd is "+pwd);
		response.getWriter().close();
	    
	}

客户端则将之前代码的注释取消掉即可

 我们来看一下效果

因此我们成功得到了来自服务器的消息。

 

 

其实get方法可以直接用url进行调用,就是不设置header,直接url调用。

 

 

 

本文参考自博客https://blog.csdn.net/wjky2014/article/details/8900484

由于get方法是明文传输,且字数大小有限制,因此我们在某些情境下一般不使用get方法,而使用Post传输方式。

下篇博客将进行介绍POST方法。

 

 


 

  • 4
    点赞
  • 0
    评论
  • 14
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值