一、HTTP简介
1.1 概要
HTTP是一个客户端和服务器端请求和应答的标准。客户端是终端用户,服务器端是网站。通过使用Web浏览器、网络爬虫或者其他的工具,客户端发起一个到服务器上指定端口(默认端口为80/443)的HTTP请求,我们称这个客户端为用户代理(User Agent)。应答的服务器上存储着(一些)资源,如HTML文件和图像,我们称这个应答服务器为源服务器(Origin Server)。在用户代理和源服务器中间可能存在多个中间层,如代理网关,或者隧道(Tunnels)。
TCP/IP协议是互联网上最流行的应用,HTTP协议并没有规定必须使用它和(基于)它支持的层。事实上,HTTP可以在任何其他互联网协议上,或者在其他网络上实现。HTTP只假定(其下层协议提供)可靠的传输,任何能够提供这种保证的协议都可以被其使用。
由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端发送过来的请求。一旦收到请求,服务器(向客户端)发回一个状态行,如“HTTP/1.1 200 OK”,和(响应的)消息,消息的消息体可能是请求的文件、错误消息、或者其他一些信息。
Internet的基本协议是TCP/IP协议,然而在TCP/IP模型最上层的是应用层(Application Layer),它包含所有高层的协议。高层协议有文件传送协议FTP、简单邮件传送协议SMTP、域名系统服务DNS、网络新闻传送协议NNTP和HTTP协议等。
关于http的一些基础知识可以看我其他文章HTTP协议状态码-CSDN博客
1.2 http请求过程
http核心概念,请求头(Request headers),请求体(Request body),响应头(Response headers),响应头(Response body)
所以我们调用类库就是把响应的参数传递过去,把返回的内容进行解析
二、HttpURLConnection
这个是java官方自带的一个网络请求库,功能应有尽有,但效率中等,这个原理是 监听TCP端口,建立socket等基础操作
//创建连接
URL url = new URL(httpUrl);
connection = (HttpURLConnection) url.openConnection();
//设置请求方式
connection.setRequestMethod("GET");
//设置连接超时时间
connection.setReadTimeout(15000);
//开始连接
connection.connect();
//获取响应数据
if (connection.getResponseCode() == 200) {
//获取返回的数据
InputStream is = connection.getInputStream();
//读取流....
}
//关闭远程连接
connection.disconnect();
三、okhttp3
官方说明:Overview - OkHttp
原理基本都是一致,HTTP请求作为一个高层协议,都是基于TCP/IP模型,对socket进行封,实现http通信,但细节处理不一样,比如引入一些连接的缓存,失败重连等
OKHTTP的一些改进或优点
1.支持http2.0版本,并且允许对同一主机的所有请求共享一个套接字
2.即使不是http2.0版本,通过连接池,减少请求延迟
3.默认使用Gzip 压缩数据
4.响应缓存,避免重复请求网络
3.1 GET
OkHttpClient client = new OkHttpClient();
String run(String url) throws IOException {
Request request = new Request.Builder()
.url(url)
.build();
try (Response response = client.newCall(request).execute()) {
return response.body().string();
}
}
3.2 POST
public static final MediaType JSON = MediaType.get("application/json");
OkHttpClient client = new OkHttpClient();
String post(String url, String json) throws IOException {
RequestBody body = RequestBody.create(json, JSON);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
.addHeader("Authorization","Bear tokencontent")
.addHeader("Content-Type","application/x-www-form-urlencoded") //可选,也可以通过创建RequestBody的时候指定
try (Response response = client.newCall(request).execute()) {
return response.body().string();
}
}
另外也可以使用 FormBody,对应 Content-Type:application/x-www-form-urlencoded
FormBody formBody = new FormBody.Builder()
.add("grant_type","password")
.add("scope","write")
.add("username",environment.getProperty("Avamar."+position+".username"))
.add("password",environment.getProperty("Avamar."+position+".password"))
.build();
真的的是一环扣一环,Content-Type的类别可以看我的同名博客content-type的理解和日常实践
四、RestTemplate
这个依赖于Spring的环境,简洁易用
RestTemplate restTemplate = new RestTemplate();
String result = restTemplate.exchange(url, HttpMethod.GET, null, String.class).getBody();
五、总结
实现的方式有很多种,但原理我们需要清晰,http是一个应用层的协议,文中提到的框架都是基于对socket的封装,实现一些自定义的操作,技术是相互关联的,对网络编程也建议能有所学习了解