android与服务端的的http请求数据交互

原创 2016年06月02日 11:10:24

本文介绍一下android与服务端的的数据交互

一、 搭建一个简易的服务端工程。注备工作:eclipse JavaEE、tomcat的安装。

在eclipse平台创建一个名为MyWeb的Dynamic Web Project,创建名为MyServlet的servlet与android客户端进行数据交互,代码如下:


import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * Servlet implementation class MyServlet
 */
@WebServlet("/MyServlet")
public class MyServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    public MyServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doRequest(request);
        doResponse(response);
    }

    /**
     * 请求的相关处理
     * @param request
     * @throws IOException
     */
    protected void doRequest(HttpServletRequest request) throws IOException{
        //获取请求头携带的参数并打印在控制台
        String token = request.getHeader("token");
        System.out.println("token="+token);

        //获取请求携带的参数并打印
        String name = request.getParameter("name");
        String age = request.getParameter("age");
        System.out.println("name="+name);
        System.out.println("age="+age);
    }

    /**
     * 响应的相关处理
     * @param response
     */
    protected void doResponse(HttpServletResponse response) {
        /**
         * 设置response的相关属性
         */
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = null;
        try {
            writer = response.getWriter();

            /**
             * 响应请求的字符串
             */
            String returnJson = "来自服务端的字符串";
            /**
             * 写入json
             */
            writer.write(returnJson);
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            writer.flush();
            writer.close();
        }
    }
}

此时将在工程run在tomcat上。并在浏览器输入http://192.168.1.35:8080/MyWeb/MyServlet?name=changj&age=20,此时浏览器会得到服务器响应的“来自服务端的字符串”,eclipse搭建的服务器端会在控制台打印请求携带的参数name=changj,age=20 的请求信息。此时一个简易的服务器搭建完成。

二、 android客户端的编写。将HttpURLConnection封装成一个工具类,代码如下:

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * Created by changj on 16/5/31.
 */
public class HttpUtils {

    /**
     * 请求超时时间5000
     */
    private static final int TIMEOUT_IN_MILLIONS = 5000;
    /**
     * 默认访问的头信息token,密钥参数
     */
    public static final String HTTP_HEADER_PARAM = "token";

    /**
     * 请求回调接口
     */
    public interface HttpCallBackListener {
        //请求成功回调
        public void onFinish(String result);
        //请求失败回调
        public void onError(Exception e);
    }


    /**
     * 异步的Get请求
     *
     * @param urlStr 请求url地址
     * @param listener 请求结果回调
     */
    public static void doGetAsyn(final String urlStr, final HashMap<String,String> params, final HttpCallBackListener listener) {
        new Thread() {
            public void run() {
                try {
                    String result = doGet(urlStr,params);
                    if (listener != null) {
                        listener.onFinish(result);
                    }
                } catch (Exception e) {
                    if (listener != null){
                        listener.onError(e);
                    }
                }

            };
        }.start();
    }

    /**
     * 异步的Post请求
     * @param urlStr
     * @param params
     * @param listener
     */
    public static void doPostAsyn(final String urlStr, final HashMap<String,String> params, final HttpCallBackListener listener) {
        new Thread() {
            public void run() {
                try {
                    String result = doPost(urlStr, params);
                    if (listener != null) {
                        listener.onFinish(result);
                    }
                } catch (Exception e) {
                    if (listener != null){
                        listener.onError(e);
                    }
                }

            };
        }.start();

    }

    /**
     * Get请求,获得返回数据
     *
     * @param urlStr
     * @return
     * @throws Exception
     */
    public static String doGet(String urlStr,HashMap<String,String> params) {
        URL url = null;
        HttpURLConnection conn = null;
        InputStream is = null;
        ByteArrayOutputStream baos = null;
        try {
            StringBuilder sb = null;
            if (params != null) {
                //将HashMap<String,String> params转化成name1=value1&name2=value2 的形式
                sb = toRequestString(params);
                }
            // 将url整合成携带参数的url:http://192.168.1.35:8080/MyWeb/MyServlet?name=changj&age=10
            url = new URL(String.format(urlStr+"?%s",sb));
            // 打开和URL之间的连接
            conn = (HttpURLConnection) url.openConnection();
            //设置读取超时、连接超时
            conn.setReadTimeout(TIMEOUT_IN_MILLIONS);
            conn.setConnectTimeout(TIMEOUT_IN_MILLIONS);
            //设置请求方式
            conn.setRequestMethod("GET");
            // 设置通用的请求属性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("content-Type","application/json;charset=UTF-8");
            conn.setRequestProperty(HTTP_HEADER_PARAM,"CHANGJ");
            if (conn.getResponseCode() == 200) {
                //读取服务器返回的数据流
                is = conn.getInputStream();
                baos = new ByteArrayOutputStream();
                int len ;
                byte[] buf = new byte[128];
                while ((len = is.read(buf)) != -1) {
                    baos.write(buf, 0, len);
                }
                baos.flush();
                return baos.toString();
            } else {
                throw new RuntimeException(" responseCode is not 200 ... ");
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (is != null)
                    is.close();
            } catch (IOException e) {
            }
            try {
                if (baos != null)
                    baos.close();
            } catch (IOException e) {
            }
            conn.disconnect();
        }

        return null ;

    }

    /**
     * 向指定 URL 发送POST方法的请求
     *
     * @param urlStr
     *            发送请求的 URL
     * @param params
     *            请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
     * @return 所代表远程资源的响应结果
     * @throws Exception
     */
    public static String doPost(String urlStr, HashMap<String,String> params) {
        PrintWriter out = null;
        BufferedReader in = null;
        String result = "";
        try {
            URL url = new URL(urlStr);
            // 打开和URL之间的连接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            //设置请求方式
            conn.setRequestMethod("POST");
            //设置读取超时、连接超时
            conn.setReadTimeout(TIMEOUT_IN_MILLIONS);
            conn.setConnectTimeout(TIMEOUT_IN_MILLIONS);
            // 设置通用的请求属性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            conn.setRequestProperty("charset", "utf-8");
            conn.setRequestProperty(HTTP_HEADER_PARAM,"CHANGJ");
            conn.setUseCaches(false);
            // 发送POST请求必须设置如下两行
            conn.setDoOutput(true);
            conn.setDoInput(true);

            if (params != null) {
                //将HashMap<String,String> params转化成name1=value1&name2=value2 的形式
                StringBuilder sb = toRequestString(params);
                // 获取URLConnection对象对应的输出流
                out = new PrintWriter(conn.getOutputStream());
                // 发送请求参数
                out.print(sb);
                // flush输出流的缓冲
                out.flush();
            }
            // 定义BufferedReader输入流来读取URL的响应
            in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 使用finally块来关闭输出流、输入流
        finally {
            try {
                if (out != null) {
                    out.close();
                }
                if (in != null) {
                    in.close();
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        return result;
    }

    /**
     * 将map类型转换成name1=value1&name2=value2 的形式
     * @param map
     * @return
     */
    private static StringBuilder toRequestString(HashMap<String,String> map){
        StringBuilder sb = new StringBuilder();
        Iterator it = map.entrySet().iterator();
        while(it.hasNext()){
            Map.Entry entry = (Map.Entry)it.next();
            Object key = entry.getKey();
            Object val = entry.getValue();
            sb.append(key);
            sb.append("=");
            sb.append(val);
            sb.append("&");
        }
        return sb;
    }
}

activity的编写使用(注意:由于请求采用开辟子线程的异步请求,在更改ui时许借助Handler),代码如下:

Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            String s = (String) msg.obj;
            Toast.makeText(getActivity(),s,Toast.LENGTH_SHORT).show();
        }
    };

    private void request(){
        String url = "http://192.168.1.35:8080/HttpServers/test";
        //String url = "http://192.168.1.35:8080/MyWeb/MyServlet";

        HttpUtils.doGetAsyn(url, new HttpUtils.HttpCallBackListener() {
            @Override
            public void onFinish(String result) {
                Log.d("changj",result);
                Message message = new Message();
                message.obj=result;
                handler.sendMessage(message);
            }

            @Override
            public void onError(Exception e) {

            }

        });

大功告成。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Http与服务器的交互(主要post和get)

要了解Http(Hyper Text Transfer Protocol(超文本传输协议))与服务器的交互,先大概介绍下http是什么,其实就是一些人写出来的规则,用来规定了浏览器和万维网服务器之间互...
  • u012782626
  • u012782626
  • 2014年03月16日 12:03
  • 2481

通俗易懂客户端与服务器端交互原理(HTTP数据请求与HTTP响应,包括Servlet部分)

经常看到HTTP客户端与服务器端交互原理的各种版本的文章,但是专业术语太多,且流程过于复杂,不容易消化。于是就按照在 Servlet 里面的内容大致做了一些穿插。本来 连 Tomcat 容器 和 Se...
  • lvpin
  • lvpin
  • 2007年06月09日 18:49
  • 6739

Android客户端与服务器HTTP交互,数据以json格式传输

/** * HTTP请求服务器 * @author lz */ public class HttpRequestServer{ private String serverCategoryStr...
  • mybaby525
  • mybaby525
  • 2014年01月14日 22:11
  • 1948

Android服务器与客户端数据交互(Http协议)

Android与服务器通信通常采用的是HTTP通信方式和Socket通信方式,本章主要介绍HTTP协议。...
  • Fighting_67
  • Fighting_67
  • 2015年09月17日 19:04
  • 1909

jQuery的ajax前后台数据交互

jquery与struts2的ajax交互,以及web.xml,struts.xml配置
  • yhl_jxy
  • yhl_jxy
  • 2015年07月09日 16:28
  • 2039

android客户端与php服务器的json数据简单交互(一)

本文是caiy
  • u012803869
  • u012803869
  • 2014年04月21日 21:49
  • 5119

Android客户端和服务器端数据交互的第四种方法

Android客户端和服务器端数据交互的第四种方法
  • wangshuxuncom
  • wangshuxuncom
  • 2015年01月15日 15:29
  • 4154

Web服务器和http请求

一、web服务器  目前最主流的三个Web服务器是Apache、Nginx、 IIS。 Web服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务。1、Web服务器...
  • Tina224243
  • Tina224243
  • 2017年04月07日 17:07
  • 633

客户端和服务器数据交互

客户端一次把数据取出,还是分多次来取? 有的人说把数据一次从数据库取到客户端然后在客户端任意处理效率会高。有的人说把一次性把所有数据取到客户端很耗时且数据大多没有用处最好分次处理。其实这两个说法并不矛...
  • hbxtlhx
  • hbxtlhx
  • 2007年11月14日 15:34
  • 2184

java或者android通过http获取服务端数据

现在的开发一般都分为客户端和服务端开发,主要是服务端提供统一的接口,在客户端不同的情况下,服务端照样维持相同的接口,省去了许多开发成本。但对于客户端和服务端的连接就显得比较重要,现在通讯一般有两种方式...
  • u013766436
  • u013766436
  • 2016年03月27日 15:56
  • 738
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android与服务端的的http请求数据交互
举报原因:
原因补充:

(最多只允许输入30个字)