栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

网络编程——HTTP

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

网络编程——HTTP

HTTP协议概述

HTTP就是目前使用最广泛的Web应用程序使用的基础协议,例如,浏览器访问网站,手机App访问后台服务器,都是通过HTTP协议实现的,HTTP是Hyper Transfer Protocol的缩写,翻译为超文本传输协议,它是基于TCP协议之上的一种请求-响应协议。

当浏览器希望访问某个网站时,浏览器和网站服务器之间首先建立TCP连接,且服务器总是使用80端口和加密端口443,然后,浏览器向服务器发送一个HTTP请求,服务器收到后,返回一个HTTP响应,并且在响应中包含了HTML的网页内容,这样,浏览器解析HTML后就可以给用户显示网页了。一个完整的HTTP请求响应如下;

代码实现:

package com.hwh.http;


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class HttpServer {
	public static void main(String[] args) {
		try (ServerSocket socket = new ServerSocket(1111)) {
			while(true) {
				//等待连接
				Socket browser = socket.accept();

			try (BufferedWriter writer=new BufferedWriter(
					new OutputStreamWriter(browser.getOutputStream()));){
				
				writer.write("HTTP/1.1 200 OK");
				writer.newLine();
				writer.newLine();
				writer.write("欢迎加入tsboys!");
			} catch (Exception e) {
				e.printStackTrace();
			}			
			}
		} catch (IOException e) {
			
			e.printStackTrace();
		}
		
	}


}

HTTP请求的格式是固定的,它由HTTP Header和HTTP Body两部分构成。第一行总是请求方法和HTTP版本:例如,GET/HTTP/1.1表示使用GET请求,路径是/,版本HTTP/1.1。

后续的每一行都是固定的Header:Value格式,我们称为HTTP Header,服务器依靠某些特定的Header识别客户端请求,例如:

1、Host :表示请求的域名,因为一台服务器上可能有多个网站,因此有必要依靠 Host 来识别 请求是发给哪个网站的;

2、User-Agent :表示客户端自身标识信息,不同的浏览器有不同的标识,服务器依靠 UserAgent 判断客户端类型是 IE 还是 Chrome ,是 Firefox 还是一个 Python 爬虫;

3、Accept :表示客户端能处理的 HTTP 响应格式, */* 表示任意格式, text/* 表示任意文 本, image/png 表示PNG格式的图片;

4、Accept-Language :表示客户端接收的语言,多种语言按优先级排序,服务器依靠该字段给 用户返回特定语言的网页版本。

如果是 GET 请求,那么该 HTTP 请求只有 HTTP Header ,没有 HTTP Body 。如果是 POST 请 求,那么该 HTTP 请求带有 Body ,以一个空行分隔。

一个典型的带 Body 的 HTTP 请求如下:

POST /login HTTP/1.1
Host: www.example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 30

username=hello&password=123456

POST 请求通常要设置 Content-Type 表示 Body 的类型, Content-Length 表示 Body 的长度, 这样服务器就可以根据请求的 Header 和 Body 做出正确的响应。 此外, GET 请求的参数必须附加在 URL 上,并以 URLEncode 方式编码,例如: http://ww w.example.com/?a=1&b=K%26R ,参数分别是 a=1 和 b=K&R 。因为 URL 的长度限制, GET 请求的 参数不能太多,而 POST 请求的参数就没有长度限制,因为 POST 请求的参数必须放到 Body 中。 并且, POST 请求的参数不一定是 URL 编码,可以按任意格式编码,只需要在 Content-Type 中正 确设置即可。

常见的发送 JSON 的 POST 请求如下:

POST /login HTTP/1.1
Content-Type: application/json
Content-Length: 38

{"username":"bob","password":"123456"}

HTTP响应也是由Header和body俩部分组成,一个典型的HTTP协议如下:

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 133251



Hello
...

响应的第一行总是 HTTP版本 响应代码 响应说明 :例如, HTTP/1.1 200 OK 表示版本是 HTTP/1.1 ,响应代码是 200 ,响应说明是 OK 。客户端只依赖响应代码判断 HTTP 响应是否成 功。 HTTP 有固定的响应代码:

1xx:表示一个提示性响应,例如101表示将切换协议,常见于WebSocket连接;

2xx:表示一个成功的响应,例如200表示成功,206表示只发送了部分内容;

3xx:表示一个重定向的响应,例如301表示永久重定向,303表示客户端应该按指定路径重新 发送请求;

4xx:表示一个因为客户端问题导致的错误响应,例如400表示因为Content-Type等各种原因导 致的无效请求,404表示指定的路径不存在;

5xx:表示一个因为服务器问题导致的错误响应,例如500表示服务器内部故障,503表示服务 器暂时无法响应。

HTTP编程

浏览器本质上也属于一种 HTTP 客户端,所以,客户端的 HTTP 编程,它的行为本质上和浏览器是 一样的,即发送一个HTTP请求,接收服务器响应后,获得响应内容。只不过浏览器进一步把响应内 容解析后渲染并展示给了用户,而我们使用 Java 进行HTTP客户端编程仅限于获得响应内容。

HTTP编程的实例:

代码如下:

package com.hwh.http;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.nio.charset.StandardCharsets;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

public class DataFetch3 {
	public static void main(String[] args) {
		try {
			URL url=new URL("https://movie.douban.com/");
			//打开链接
			HttpURLConnection connection=(HttpURLConnection)url.openConnection();
			//设置请求方式
			connection.setRequestMethod("GET");
			//设置请求Header属性
			connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3870.400 QQBrowser/10.8.4405.400");
	        try (BufferedReader reader=new BufferedReader(new InputStreamReader(connection.getInputStream(),StandardCharsets.UTF_8))){
				String line=null;
				while((line=reader.readLine())!=null) {
					//去除该行空格
					line=line.trim();
					//判断当前行是否含有海报图片路径
					if(line.startsWith("

运行的结果:

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1019735.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号