在网上看了不少关于get和post的文章,现在手录下来。

一:B/S结构,浏览器端到服务器端通信依赖http协议

交互过程:

1:在浏览器地址栏输入http://ip:port/应用/资源路径

2:浏览器根据ip和服务器建立连接,port确定和那个应用进行交互,因为ip主机上面有

很多应用程序。

3:浏览器端发送请求以及参数到服务器端,就是url(同一资源定位器),确定请求资源。

4:服务器处理请求,将处理后的结果响应发送到浏览器。

5:浏览器得到资源后,渲染到界面,显示给用户。

优点:B/S交互可以省去客户端部署升级的风险,降低了成本,只需要关注服务器开发。 

二:C/S结构,客户端到服务器端通信也是依赖HTTP协议

主要是java应用程序与服务器的交互,交互过程:

1:根据请求url创建URL对象

2:创建连接对象URLConnection,设置连接参数,建立连接。

3:发送请求到服务器,服务器进行处理

4:服务器发送响应到客户端。

 

三:get请求与post请求的异同点

1:get请求会将请求参数显示在请求地址的后面,post不会,所以post相较于get更安全,但是安全是相对的,

如果追求安全发送请求还是要加密。

2:get请求发送数据理论上是4kb,而post理论上可以发送任意大的数据

3:如果是C/S结构,post请求在建立连接前,要设置DoInput和DoOutput的值

 四:java程序请求服务器实例 

get请求案例:

/**
     * 发送get请求,参数放在url后面
     */
    public static String sendGetRequest(String url, String params) {
        StringBuilder result = new StringBuilder();
        String realUrl = url + "?" + params;
        InputStream in = null;
        BufferedReader br = null;
        try {
            // 与服务器建立连接
            URL u = new URL(realUrl);
            URLConnection conn = u.openConnection();
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "keep-alive");
            conn.connect();

            // 获取响应头
            Map<String, List<String>> map = conn.getHeaderFields();
            Set<String> set = map.keySet();
            Iterator<String> it = set.iterator();
            while (it.hasNext()) {
                String key = it.next();
                System.out.println(key + ":::" + map.get(key));
            }

            // 获取响应数据
            in = conn.getInputStream();
            br = new BufferedReader(new InputStreamReader(in, "utf-8"));
            String line;
            while ((line = br.readLine()) != null) {
                result.append(line);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != in) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != br) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return result.toString();
    }

 post请求案例:

/**
     * 发送post请求,参数单独发送到服务器端
     */
    public static String sendPostRequest(String url, String params) {
        StringBuilder result = new StringBuilder();
        String realUrl = url;
        InputStream in = null;
        BufferedReader br = null;
        try {
            // 与服务器建立连接
            URL u = new URL(realUrl);
            URLConnection conn = u.openConnection();
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "keep-alive");

            // post请求必须设置请求头
            conn.setDoInput(true);
            conn.setDoOutput(true);
            conn.connect();

            // 发送参数到服务器
            OutputStream out = conn.getOutputStream();
            PrintWriter pw = new PrintWriter(new OutputStreamWriter(out,
                    "utf-8"));
            pw.print(params);
            pw.flush();
            pw.close();

            // 获取响应头
            Map<String, List<String>> map = conn.getHeaderFields();
            Set<Entry<String, List<String>>> entry = map.entrySet();
            Iterator<Entry<String, List<String>>> it = entry.iterator();
            while (it.hasNext()) {
                Entry<String, List<String>> en = it.next();
                System.out.println(en.getKey() + ":::" + en.getValue());
            }

            // 获取响应数据
            in = conn.getInputStream();
            br = new BufferedReader(new InputStreamReader(in, "utf-8"));
            String line;
            while ((line = br.readLine()) != null) {
                result.append(line);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != in) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != br) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return result.toString();
    }

 测试案例:

// 测试发送请求
    public static void main(String[] args) {
        String url = "http://localhost:8080/healthcare/dataAnalysis/search.do";
        String params = "tname=employee";
        // 测试get请求
        System.out.println(SendGetAndPost.sendGetRequest(url, params));
        // 测试post请求
        System.out.println(SendGetAndPost.sendPostRequest(url, params));
    }