建立HTTP通信(GET/POST方式)
1.要求
此程序可以建立HTTP通信,以GET方式和POST方式向WEB服务器提交信息,并接收WEB服务器返回的响应。
2.GET和POST请求
GET请求:
- GET查询字符串(名称/值对)是在 GET 请求的 URL 中发送的:
- GET 请求可被缓存
- GET 请求保留在浏览器历史记录中
- GET 请求可被收藏为书签
- GET 请求不应在处理敏感数据时使用
- GET 请求有长度限制
- GET 请求只应当用于取回数据
POST请求
- POST查询字符串(名称/值对)是在 POST 请求的 HTTP 消息主体中发送的
- POST 请求不会被缓存
- POST 请求不会保留在浏览器历史记录中
- POST 不能被收藏为书签
- POST 请求对数据长度没有要求
3.实现过程
- 使用GET方法进行通信,主要实在建立URL链接后通过URLconnection实例调用getInputStream方法得到数据流,然后进行输出。
- 使用POST方法进行通信,与GET不用的是需要把请求放在Http正文中。 具体的步骤: 首先,创建URL。 其次打开链接,设置允许读取和上传的权限。 然后,设置读取方式为POST,创建输出流,将向服务器传输的数据一次性写出,再获取输入流,从输入流中读取数据。
4.测试API地址
本文所使用的测试API接口地址如下:
https://cre.dp.sina.cn/api/v3/get?cateid=I&cre=tianyi&mod=wedu&merge=3&statics=1&length=20&tm=1489716199&ad={%22rotate_count%22:1144,%22page_url%22:%22https%3A%2F%2Fedu.sina.cn%2F%22,%22channel%22:%22130270%22,%22platform%22:%22wap%22,%22timestamp%22:1515924429346,%22net%22:null}&action=1&up=2&down=0&length=12&_=1515924436197&callback=Zepto1515924429314
https://cre.dp.sina.cn/api/v3/get?cateid=I&cre=tianyi&mod=wedu&merge=3&statics=1&length=20&tm=1489716199&ad={%22rotate_count%22:1144,%22page_url%22:%22https%3A%2F%2Fedu.sina.cn%2F%22,%22channel%22:%22130270%22,%22platform%22:%22wap%22,%22timestamp%22:1515924429346,%22net%22:null}&action=1&up=2&down=0&length=12&_=1515924436197&callback=Zepto1515924429314
(若想更换为其他用于测试的API地址可点击此处)
5.代码
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class rw28 {
public static void main(String[] args) {
// TODO Auto-generated method stub
new GetRun().start();//get请求
new PostRun().start();//post请求
}
}
class GetRun extends Thread{
public void run() {
try {
//doctype=xml/json/jsonp
URL url = new URL("http://www.kuaidi100.com/query?type=yuantong&postid=11111111111");
URLConnection connection = url.openConnection();
InputStream in = connection.getInputStream();
InputStreamReader isr = new InputStreamReader(in,"utf-8");
BufferedReader br = new BufferedReader(isr);
String line;
StringBuilder sb = new StringBuilder();
while((line = br.readLine()) != null)
{
sb.append(line);
}
br.close();
isr.close();
in.close();
System.out.println("使用GET方式得:\n"+sb.toString());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class PostRun extends Thread{
@Override
public void run() {
try {
URL url = new URL("http://www.kuaidi100.com/query");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.addRequestProperty("encoding", "UTF-8");//添加请求属性
connection.setDoInput(true);//允许输入
connection.setDoOutput(true);//允许输出
connection.setRequestMethod("POST");//POST请求要在获取输入输出流之前设置否则报错
//输出
OutputStream os = connection.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
bw.write("type=yuantong&postid=11111111111");
bw.flush();
//输入
InputStream in = connection.getInputStream();
InputStreamReader isr = new InputStreamReader(in,"UTF-8");
BufferedReader br = new BufferedReader(isr);
String line;
StringBuilder sb = new StringBuilder();
while((line = br.readLine()) != null)
{
sb.append(line);
}
bw.close();
osw.close();
os.close();
br.close();
isr.close();
in.close();
System.out.println("使用POST方式得:\n"+sb.toString());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class rw28 {
public static void main(String[] args) {
// TODO Auto-generated method stub
new GetRun().start();//get请求
new PostRun().start();//post请求
}
}
class GetRun extends Thread{
public void run() {
try {
//doctype=xml/json/jsonp
URL url = new URL("http://www.kuaidi100.com/query?type=yuantong&postid=11111111111");
URLConnection connection = url.openConnection();
InputStream in = connection.getInputStream();
InputStreamReader isr = new InputStreamReader(in,"utf-8");
BufferedReader br = new BufferedReader(isr);
String line;
StringBuilder sb = new StringBuilder();
while((line = br.readLine()) != null)
{
sb.append(line);
}
br.close();
isr.close();
in.close();
System.out.println("使用GET方式得:\n"+sb.toString());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class PostRun extends Thread{
@Override
public void run() {
try {
URL url = new URL("http://www.kuaidi100.com/query");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.addRequestProperty("encoding", "UTF-8");//添加请求属性
connection.setDoInput(true);//允许输入
connection.setDoOutput(true);//允许输出
connection.setRequestMethod("POST");//POST请求要在获取输入输出流之前设置否则报错
//输出
OutputStream os = connection.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
bw.write("type=yuantong&postid=11111111111");
bw.flush();
//输入
InputStream in = connection.getInputStream();
InputStreamReader isr = new InputStreamReader(in,"UTF-8");
BufferedReader br = new BufferedReader(isr);
String line;
StringBuilder sb = new StringBuilder();
while((line = br.readLine()) != null)
{
sb.append(line);
}
bw.close();
osw.close();
os.close();
br.close();
isr.close();
in.close();
System.out.println("使用POST方式得:\n"+sb.toString());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
6.结果
编译结果如下图所示:
运行结果如下图所示:
GET方法:
POST方法:
7.GET/POST的区别
- get请求一般会把参数附着在请求的后面,并用?隔开。这样的话参数容易暴露,类似密码这样的参数等。
特点:传送的数据是有限制的,一般限制在1kb以下;
例如:
Request URL:
http://localhost:8080/JavaWeb_001/actionServlet?user=zhangqin&password=zhangqin&submit=submit
http://localhost:8080/JavaWeb_001/actionServlet?user=zhangqin&password=zhangqin&submit=submit
- post请求的方式传送的表单字段元素以及其数据作为http实体内容发送给web服务器,传送的数据量比get请求大得多。
如下所示:
Request URL:http://localhost:8080/JavaWeb_001/actionServlet
Request Method:POST
Status Code:404 Not Found
Remote Address:[::1]:8080
Referrer Policy:no-referrer-when-downgrade
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, br
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Content-Length:45
Content-Type:application/x-www-form-urlencoded
Host:localhost:8080
Origin:http://localhost:8080
Referer:http://localhost:8080/JavaWeb_001/login.html
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3004.3 Safari/537.36
user:zhangqin
password:zhangqin
submit:submit ----请求中传递的数据参数
Request URL:http://localhost:8080/JavaWeb_001/actionServlet
Request Method:POST
Status Code:404 Not Found
Remote Address:[::1]:8080
Referrer Policy:no-referrer-when-downgrade
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, br
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Content-Length:45
Content-Type:application/x-www-form-urlencoded
Host:localhost:8080
Origin:http://localhost:8080
Referer:http://localhost:8080/JavaWeb_001/login.html
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3004.3 Safari/537.36
user:zhangqin
password:zhangqin
submit:submit ----请求中传递的数据参数