java HTTP通信
一、相关知识学习
1、 HTTP通信原理
HTTP是一套计算机通过网络进行通信的规则,HTTP使HTTP客户(如Web浏览器)能够从HTTP服务器(Web服务器)请求信息和服务,HTTP是一种无状态的协议,无状态是指Web浏览器和Web服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后Web服务器返回响应(response),连接就被关闭了,在服务器端不保留连接的有关信息。HTTP遵循请求(Request)/应答(Response)模型,Web浏览器向Web服务器发送请求,Web服务器处理请求并返回适当的应答,所有HTTP连接都被构造成一套请求和应答。
Http通信主要有两种方式POST方式和GET方式。前者通过Http消息实体发送数据给服务器,安全性高,数据传输大小没有限制,后者通过URL的查询字符串传递给服务器参数,以明文显示在浏览器地址栏,保密性差,最多传输2048个字符。但是GET请求并不是一无是处——GET请求大多用于查询(读取资源),效率高。POST请求用于注册、登录等安全性较高且向数据库中写入数据的操作。
2、 使用URLConnection实现GET请求
具体的步骤:
- 实例化一个java.net.URL对象;
- 通过URL对象的openConnection()方法得到一个java.net.URLConnection;
- 通过URLConnection对象的getInputStream()方法获得输入流;
- 读取输入流;
- 关闭资源。
3、使用Http中的POST方法进行Http通信
使用POST进行通信,与GET不用的是需要把请求放在Http正文中。
具体的步骤:
- 创建URL。
- 打开链接,设置允许读取和上传的权限。
- 然后,设置读取方式为POST,创建输出流,将向服务器传输的数据一次性写出
- 再获取输入流,从输入流中读取数据。
二、训练
任务要求:
- 编写一个java application应用程序,完成以下功能:
- 此程序可以建立HTTP通信,以GET方式向WEB服务器提交信息,并接收WEB服务器返回的响应。
- 此程序可以建立HTTP通信,以POST方式向WEB服务器提交信息,并接收WEB服务器返回的响应。
- 以上程序工作时URL中各个部分:IP地址或域名、端口、路径等应当能由用户指定。
java程序
GET方式(test1.java)
import java.io.*;//导入java.io包下的所有类
import java.net.*;//导入java.net包下的所有类
public class test1 {
public static void main(String[] args) {
new ByGet().start();//开启线程
}
static class ByGet extends Thread{ //创建Thread子类
public void run() {
try {
URL url = new URL("http://fanyi.youdao.com");//实例化一个URL对象,用百度有道翻译进行了测试
URLConnection connection = url.openConnection();//通过URL对象的openConnection()方法得到一个java.net.URLConnection;
InputStream is = connection.getInputStream(); // 获取输入流
InputStreamReader isr = new InputStreamReader(is,"utf-8");//在InputStreamReader中指定编码,手动指定为UTF-8
BufferedReader br = new BufferedReader(isr);//实例化一个BufferedReader对象用来存放转换后的字符
String line;
StringBuilder builder = new StringBuilder();
while ((line = br.readLine()) != null) { // 读取数据
builder.append(line+"\n");
}
br.close();//关闭流
isr.close();
is.close();
System.out.println(builder.toString());
} catch (MalformedURLException e) {//异常处理
e.printStackTrace();//打印异常所在位置及原因
}
catch (IOException e) {
e.printStackTrace();
}
}
}
}
POST方式方式(test2.java)
import java.io.*;//导入java.io包下的所有类
import java.net.*;//导入java.net包下的所有类
public class test2 {
public static void main(String[] args) {
new ByPost().start();//开启线程
}
static class ByPost extends Thread{//创建Thread子类
public void run() {
try {
URL url = new URL("http://fanyi.youdao.com/openapi.do");//实例化一个URL对象
URLConnection connection = url.openConnection();//通过URL对象的openConnection()方法得到一个java.net.URLConnection;
connection.addRequestProperty("encoding", "UTF-8");//设置请求属性
connection.setDoInput(true);//允许从服务器上获取数据
connection.setDoOutput(true);//允许向服务器传输数据
((HttpURLConnection) connection).setRequestMethod("POST");//设置请求模式为post请求
OutputStream os = connection.getOutputStream();// 获取输出流
OutputStreamWriter osr = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osr);
bw.write("keyfrom=<keyfrom>&key=<key>&type=data&doctype=<doctype>&version=1.1&q=welcome");//指定输入的内容
bw.flush();
InputStream is = connection.getInputStream();// 获取输入流
InputStreamReader isr = new InputStreamReader(is,"utf-8");//在InputStreamReader中指定编码,手动指定为UTF-8
BufferedReader br = new BufferedReader(isr);//实例化一个BufferedReader对象用来存放转换后的字符
String line;
StringBuilder builder = new StringBuilder();
while ((line = br.readLine()) != null) {// 读取数据
builder.append(line+"\n");
}
bw.close();//关闭流
osr.close();
os.close();
br.close();
isr.close();
is.close();
System.out.println(builder.toString());
} catch (MalformedURLException e) {//异常处理
e.printStackTrace();//打印异常所在位置及原因
} catch (IOException e) {
e.printStackTrace();
}
}
}
}