超文本传输协议(Hyper Text Transfer Protocol)用于规范在网络中对文本数据的传输,属于应用层协议,底层是基于TCP/IP协议。
目录
HTTP协议的特点
HTTP报文
HTTP请求方法
HTTP的响应码
HTTP网络编程
URL
HttpURLConnection
自定义HTTP服务器
HTTP协议的特点
-
简单和快速
-
支持客户端和服务器之间的通信
-
无连接,一旦客户端完成访问后,和服务器的连接就会断开
-
无状态,服务器不会保留客户端的数据
-
采用请求和响应模式,客户端向服务器发送请求,服务器发送响应给浏览器。
简单和快速
支持客户端和服务器之间的通信
无连接,一旦客户端完成访问后,和服务器的连接就会断开
无状态,服务器不会保留客户端的数据
采用请求和响应模式,客户端向服务器发送请求,服务器发送响应给浏览器。
HTTP报文
客户端访问服务器时会发生请求报文,
格式如下:
响应报文格式:
HTTP请求方法
-
GET 数据会包含在URL里,不安全,对数据的长度有限制,适合于进行查询和搜索
-
POST 数据在后台发送,更加安全,对数据长度没有限制,适合于发送敏感数据
-
PUT 更新服务器资源
-
DELETE 请求删除资源
-
TRACE 跟踪服务器信息
-
OPTIONS 允许查看服务器的性能
-
HEAD 用于获取报头
-
CONNECT 将连接改为管道方式的代理服务器
GET 数据会包含在URL里,不安全,对数据的长度有限制,适合于进行查询和搜索
POST 数据在后台发送,更加安全,对数据长度没有限制,适合于发送敏感数据
PUT 更新服务器资源
DELETE 请求删除资源
TRACE 跟踪服务器信息
OPTIONS 允许查看服务器的性能
HEAD 用于获取报头
CONNECT 将连接改为管道方式的代理服务器
HTTP的响应码
服务器告诉浏览器的响应结果
代码 | 说明 |
---|---|
1xx消息 | 请求已被服务器接收,继续处理 |
2xx成功 | 请求已成功被服务器接收、理解、并接受 |
3xx重定向 | 需要后续操作才能完成这一请求 |
4xx请求错误 | 请求含有词法错误或者无法被执行 |
5xx服务器错误 | 服务器在处理某个正确请求时发生错误 |
常见响应码:
代码 | 说明 |
---|---|
200 | OK 请求成功 |
400 | Bad Request 请求有语法错误 |
401 | Unauthorized 请求未经授权 |
403 | Forbidden 服务器拒绝提供服务 |
404 | Not Found 请求资源不存在 |
405 | Method Not Found 请求方法不存在 |
500 | Internal Server Error 服务器发生错误 |
503 | Server Unavailable 服务器不能处理 |
HTTP网络编程
URL
统一资源定位系统(Uniform Resource Locator)是网络上用于指定信息位置的表示方法。
创建方法
URL url = new URL("资源的地址");
主要方法
URLConnection openConnection() 打开网络连接
HttpURLConnection
http连接
主要方法
代码 | 说明 |
---|---|
void disconnect() | 关闭连接 |
setRequestMethod(String method) | 设置请求方法 |
int getResponseCode() | 返回响应码 |
void setConnectTimeout(long time) | 设置连接超时 |
void setRequestProperty(String key,String value) | 设置请求头属性 |
InputStream getInputStream() | 获得输入流 |
OutputStream getOutputStream() | 获得输出流 |
void setDoOutput(boolean output) | 设置是否发送数据 |
long getContentLength() | 获得资源的长度 |
实现文件下载
public class DownloadDemo { public static final String DIR = "D:\files\"; public static void download(String path){ try { //创建URL对象 URL url = new URL(path); //打开连接 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //设置连接超时 conn.setConnectTimeout(5000); //请求方法 conn.setRequestMethod("GET"); //获得输入流 //创建文件输出流 String filename = UUID.randomUUID().toString().replace("-","") + ".jpg"; try(InputStream in = conn.getInputStream(); FileOutputStream out = new FileOutputStream(DIR + filename)){ byte[] bytes = new byte[1024]; int len = -1; while((len = in.read(bytes)) != -1){ out.write(bytes,0,len); } }catch (IOException ex){ ex.printStackTrace(); } System.out.println("文件下载完成"); Runtime.getRuntime().exec("mspaint " + DIR + filename); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { download("https://gimg2.baidu.com/image_search/2Fb906fe02aa964cdd95bb10f106e45bcd.png"); } }
调用后台接口
public class HttpDemo { public static void testGet(String sUrl){ try { URL url = new URL(sUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(2000); if(conn.getResponseCode() == 200){ //从输入流中读取出响应数据 BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line = null; while((line = in.readLine()) != null){ System.out.println(line); } in.close(); } } catch (Exception e) { e.printStackTrace(); } } public static void testPost(String sUrl,String args){ try { URL url = new URL(sUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setConnectTimeout(2000); conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded"); //向服务器发送参数 conn.setDoOutput(true); OutputStream out = conn.getOutputStream(); out.write(args.getBytes("UTF-8")); if(conn.getResponseCode() == 200){ //从输入流中读取出响应数据 BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line = null; while((line = in.readLine()) != null){ System.out.println(line); } in.close(); } } catch (Exception e) { e.printStackTrace(); } } public static void testPut(String sUrl,String args){ try { URL url = new URL(sUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("PUT"); conn.setConnectTimeout(2000); conn.setRequestProperty("Content-Type","application/json"); //向服务器发送参数 conn.setDoOutput(true); OutputStream out = conn.getOutputStream(); out.write(args.getBytes("UTF-8")); if(conn.getResponseCode() == 200){ //从输入流中读取出响应数据 BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line = null; while((line = in.readLine()) != null){ System.out.println(line); } in.close(); } } catch (Exception e) { e.printStackTrace(); } } public static void testDelete(String sUrl){ try { URL url = new URL(sUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("DELETE"); conn.setConnectTimeout(2000); if(conn.getResponseCode() == 200){ //从输入流中读取出响应数据 BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line = null; while((line = in.readLine()) != null){ System.out.println(line); } in.close(); } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { // testPost("http://localhost:8001/person","id=-1&name=world&age=25&gender=男"); // testPut("http://localhost:8001/person","{"id":12,"name":"hello1","age":22,"gender":"女"}"); testDelete("http://localhost:8001/person/13"); testGet("http://localhost:8001/persons"); } }
自定义HTTP服务器
public class HttpServer { public static final int PORT = 8088; public static final String DIR = "D:\html\"; //启动 public void start(){ System.out.println("启动服务器"); try(ServerSocket serverSocket = new ServerSocket(PORT)){ while (true){ //获得浏览器的连接 Socket socket = serverSocket.accept(); //通过IO流获得请求报文的第一行 try(BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))){ String line = in.readLine(); //解析出url String url = null; if(line != null){ String[] lines = line.split(" "); if(lines.length > 2){ url = lines[1]; } } //判断文件是否存在 File file = new File(DIR + url); if(file.exists()){ //存在,读取html代码 BufferedReader reader = new BufferedReader(new FileReader(file)); StringBuilder html = new StringBuilder(); String str = null; while((str = reader.readLine()) != null){ html.append(str); } reader.close(); //发送响应报文,带html代码 StringBuilder resp = new StringBuilder(); resp.append("HTTP/1.1 200 OKrn"); resp.append("Content-Type: text/html; charset=UTF-8rn"); resp.append("Content-Length: " + html.toString().getBytes("UTF-8").length+"rn"); resp.append("rn"); resp.append(html.toString()); out.write(resp.toString()); }else{ //不存在就发送404响应报文 out.write("HTTP/1.1 404 NOT FOUND"); } out.flush(); }catch (IOException ex){ ex.printStackTrace(); } } } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { new HttpServer().start(); } }