【0】README
1) 本文文字描述 转自 core java volume 2 , 旨在理解 网络——提交表单数据 的基础知识 ;
2) for source code, please visit https://github.com/pacosonTang/core-java-volume/tree/master/coreJavaAdvanced/chapter3/postRequest
【1】提交表单数据(post方式)相关
0)执行server 端脚本过程中的数据流:
1)在向web server 发送消息时, 通常会用到两个命令: GET AND POST; (干货——在向web server 发送消息时, 通常会用到两个命令: GET AND POST;)
2)get 提交方式
2.1)使用get的时候, 只需要将参数添加到 URL 的结尾处即可, 这种 URL 的格式如下:
2.2) get 命令有一个缺点: 大多数浏览器对 get 请求中可以包含的字符数做了限制; (干货——get 命令有一个缺点)
3)post 提交方式
- 3.1)在使用 post 命令时, 并不需要再URL 中添加任何参数, 而是从 URLConnection 中获取输出流, 并将 名-值对写入到流中。
3.2)POST提交方式,提交数据到 server 的详细过程: (干货——POST提交方式,提交数据到 server 的详细过程)
step1) 创建一个URLConnection对象;
URL url = new URL(urlName);
URLConnection connection = url.openConnection();step2)调用 setDoOutput 方法建立一个用于输出的连接:
connection.setDoOutput(true);
step3)调用 getOutputStream 方法获得一个流, 可以通过这个流向 server 发送数据, 如果要向 server 发送文本消息, 那么可以非常方便地将流包装在 PrintWriter 对象中:
PrintWriter out = new PrintWriter(connnection.getOutputStream());
step4) 向 server 发送数据;
out.println(name1 + “=” + URLEncoder.encode(value1, “UTF-8”) + “&”);
step5)关闭输出流:
out.close();
4)在读取响应过程中会碰到一个问题:
- 4.1) 如果脚本运行错误,那么调用 connection.getInputStream() 时就会抛出一个 FileNotFoundException 异常。但是此server 仍然会向 浏览器返回一个 错误页面(常见的404 错误);
- 4.2)为了捕捉这个错误页面, 可以将 URLConnection 对象转换为 HttpURLConnection 类并调用它的 getErrorStream 方法: (干货——如何捕捉这个错误页面)
InputStream err = ((HttpURLConnection) connection).getErrorStream();
5) 人们常会问: 除了我们提供的 数据外, URLConnection 到底还向server 发送了什么信息: (干货——除了我们提供的数据外,URLConnection 到底还向server 发送了什么信息?)
5.1) URLConnection 对象首先向 server 发送一个 请求头。 当提交表单数据时, 该请求头包含下面这行内容:
Content-Type:application/x-www-form-urlencoded
5.2)而 POST 的请求头还必须包括内容长度, 如
Content-Length:24;
5.3)请求头必须以空白行结尾。 紧随其后的才是数据部分。 web server 过滤掉请求头后将数据部分发送给server 端 脚本程序;
Attention) URLConnection 对象会把 你发送到 输出流的所有数据都缓存起来, 这是因为在真正发送前, 它必须首先确定内容的总长度;
6) 看个荔枝: (示例代码 用于将 Post 数据发送给任何脚本, 他将数据放在如下的 .properties 文件:
url = http://esa.un.org/unpd/wpp/unpp/p2k0data_script.asp
Panel=1
Variable=2
Location=404
Varient=2
StartYear=1950
EndYear=2050