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

原博客地址:http://www.cnblogs.com/warrior4236/p/5675756.html

一: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));
    }

get和post与服务端的交互方式的更多相关文章

  1. WebService的web客户端同步、异步、多线程向服务端传入参数的数据交互方式

    接着上一章的内容,在上一章中我们知道了如何.net平台下去建立一个WebService,以及同步调用.异步调用.开线程异步调用三种客户端从服务端获取数据的方式,在本章了所要讲的,是如何将客户端的数据, ...

  2. IOS开发系列之阿堂教程:玩转IPhone客户端和Web服务端交互(客户端)实践

    说到ios的应用开发,我们不能不提到web server服务端,如果没有服务端的支持,ios应用开发就没有多大意义了,因为从事过手机开发的朋友都知道(Android也一样),大量复杂业务的处理和数据库 ...

  3. Service系统服务(六):rsync基本用法、rsync+SSH同步、配置rsync服务端、访问rsync共享资源、使用inotifywait工具、配置Web镜像同步、配置并验证Split分离解析

    一.rsync基本用法 目标: 本例要求掌握远程同步的基本操作,使用rsync命令完成下列任务: 1> 将目录 /boot 同步到目录 /todir 下   2> 将目录 /boot 下的 ...

  4. 那些年,我们见过的 Java 服务端“问题”

    导读 明代著名的心学集大成者王阳明先生在<传习录>中有云: 道无精粗,人之所见有精粗.如这一间房,人初进来,只见一个大规模如此.处久,便柱壁之类,一一看得明白.再久,如柱上有些文藻,细细都 ...

  5. android 应用程序与服务端交互

    http://www.cnblogs.com/freeliver54/archive/2012/06/13/2547765.html 简述了Service的一些基础知识以及Service和Thread ...

  6. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

  7. 关于如何提高Web服务端并发效率的异步编程技术

    最近我研究技术的一个重点是java的多线程开发,在我早期学习java的时候,很多书上把java的多线程开发标榜为简单易用,这个简单易用是以C语言作为参照的,不过我也没有使用过C语言开发过多线程,我只知 ...

  8. Socket聊天程序——服务端

    写在前面: 昨天在博客记录自己抽空写的一个Socket聊天程序的初始设计,那是这个程序的整体设计,为了完整性,今天把服务端的设计细化记录一下,首页贴出Socket聊天程序的服务端大体设计图,如下图: ...

  9. zookeeper源码分析之五服务端(集群leader)处理请求流程

    leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...

随机推荐

  1. php中各种定义变量的方法

      1.定义常量define("CONSTANT", "Hello world."); 常量只能包含标量数据(boolean,integer,float 和 s ...

  2. (@WhiteTaken)设计模式学习——观察者模式

    忙里抽闲,继续学习设计模式,作为自己的读书笔记,这次介绍Java下实现的观察者模式. 观察模式需要了解的三个概念: 被观察者:被观察的对象,发生变化会通知观察者集合(存放观察者的容器) 观察者:有up ...

  3. UVa11212,Editing a Book

    正如书上所说,本题需要用IDA*算法求解 启发函数是3d+h>3maxd(d为当前操作步骤数,h为当前逆序对数,maxd为当前枚举的最大步骤数) 可见迭代递归的核心思想是枚举ans去dfs是否可 ...

  4. oracle导不出空表的解决办法

    1.先进行表分析(一定要执行此步,否则查询空表可能不准确) select 'analyze table '||table_name||' compute statistics;' from user_ ...

  5. [POJ 1410] Intersection(线段与矩形交)

    题目链接:http://poj.org/problem?id=1410 Intersection Time Limit: 1000MS   Memory Limit: 10000K Total Sub ...

  6. 【框架学习与探究之定时器--Hangfire】

    声明 本文欢迎转载,请注明文章原始出处:http://www.cnblogs.com/DjlNet/p/7603632.html 前言 在上篇文章当中我们知道关于Quartz.NET的一些情况,其实博 ...

  7. 在C#中winform程序中应用nlog日志工具

    在C#中winform程序中应用nlog日志工具,配置文件简单应用. 文件名 nlog.config,请注意修改属性为"始终复制",发布时候容易遇到不存在文件的错误提示. 通过Nu ...

  8. Java基础总结--数组

    ---数组的定义---组织存储一组数据1.存放相同类型数据的集合--就是一种容器本质上变量也是一种容器--区别就是只存储了一个数据的容器--面对容器,而不是分散的数据eg.买一盘鸡蛋--蛋托其实就是容 ...

  9. 快速配置vs2012+opencv

    关于OpenCV+Windows+VS配置的文章网上有很多,多是类似 OpenCV中文网 上的安装方法. 不管什么方法,配置的步骤毫无疑问是: 1. 配置环境变量, 2. 配置VS. 在这个过程中,令 ...

  10. babel从入门到入门

    babel从入门到入门 来源 http://www.cnblogs.com/gg1234/p/7168750.html 博客讲解内容如下: 1.babel是什么 2.javascript制作规范 3. ...