Java 发起http网络请求

一、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的封装,实现一些自定义的操作,技术是相互关联的,对网络编程也建议能有所学习了解

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java 可以使用内置的 `java.net` 包来发起 HTTP 请求。以下是一个示例: ```java import java.net.*; import java.io.*; public class HttpRequest { public static void main(String[] args) throws Exception { URL url = new URL("http://www.example.com/path/to/resource"); HttpURLConnection con = (HttpURLConnection) url.openConnection(); con.setRequestMethod("GET"); int status = con.getResponseCode(); System.out.println("Status code: " + status); BufferedReader in = new BufferedReader( new InputStreamReader(con.getInputStream())); String inputLine; StringBuffer content = new StringBuffer(); while ((inputLine = in.readLine()) != null) { content.append(inputLine); } in.close(); System.out.println("Response content: " + content.toString()); } } ``` 在上面的示例中,我们首先创建了一个 `URL` 对象,然后使用 `openConnection()` 方法打开一个连接。我们可以使用 `setRequestMethod()` 方法设置请求的方法(GET、POST 等),并且可以使用 `setRequestProperty()` 方法设置请求头。 在连接对象上调用 `getResponseCode()` 方法可以获取响应状态码。如果响应状态码为 200,则可以使用 `getInputStream()` 方法获取响应内容的输入流。我们可以使用 `BufferedReader` 类从输入流中读取响应内容,并将其存储在 `StringBuffer` 中。最后,我们关闭输入流并打印响应内容。 请注意,上面的示例使用了 `HttpURLConnection` 类来发起请求。在实际开发中,您可能还需要使用其他类库,如 Apache HttpClient。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值