如何发起一个HTTP请求,发送HTTP请求的几种方式

概述

如何发起一个HTTP请求?这个问题似乎既简单又复杂,简单是指当你在浏览器里输入一个URL时,按回车键后这个HTTP请求就发起了,很快你就会看到这个请求的返回结果。复杂是指能否不借助浏览器也能发起请求,不借助有两层含义:

  • 能不能自己组装一个符合HTTP协议,
  • 处理浏览器还有哪些方式也能简单地发起一个HTTP请求

如何发起一个HTTP请求

如何发起和如何建立一个Socket连接区别不大,只不过outputStream.write写的二进制字节数据格式要符合HTTP协议。浏览器在建立socket连接之前,必须根据地址栏输入的URL的域名DNS解析出IP地址,在根据这个IP地址和默认80端口与远程服务器建立Socket连接,然后浏览器根据这个URL组装成一个get类型的HTTP请求头,通过outputStream.write 发送到目标,服务器等待inputStream.read返回数据,最后断开这个连接

模拟浏览器发送HTTP请求方式

使用原生HttpURLConnection

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;

public class HttpClientTest {


    public static String doGet(String httpUrl) throws IOException {
        URL url = null ;
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        //设置请求方法
        connection.setRequestMethod("GET");
        //设置超时时间
        connection.setReadTimeout(1000);
        //创立连接
        connection.connect();

        InputStream inputStream = connection.getInputStream();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
        
        StringBuilder stringBuilder = new StringBuilder();
        while (bufferedReader.readLine()!=null){
            stringBuilder.append(bufferedReader.readLine());
            stringBuilder.append("\r\n");
        }
        //关闭流
        bufferedReader.close();
        //关闭连接
        connection.disconnect();
        return stringBuilder.toString() ;
    }

}

  • 使用HttpClient工具
public class HttpClientTest1 {
    /**
     * Get请求
     *
     * @param httpUrl
     * @return
     * @throws IOException
     */
    public static String doGet(String httpUrl) throws IOException {
        //1.创建httpClient,httpGet对象 2.配置请求信息 3.执行get请求,通过httpEntity对象得到返回数据 4.字符转换
        //5.关闭资源
        String result;
        //两种创建client的方法,这里是使用了CloseableHttpClient这个实现类,相当于已经废弃的defaultHttpClient
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpGet httpGet = new HttpGet(httpUrl);
        //根据实际配置,这里是默认配置,超时设置连接设置什么的都是通过RequestConfig对象配置的
        httpGet.setConfig(RequestConfig.DEFAULT);
        CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
        HttpEntity httpEntity = httpResponse.getEntity();
        result = EntityUtils.toString(httpEntity);
        httpResponse.close();
        return result;
 
    }
 
    /**
     * Post请求
     *
     * @param httpUrl
     * @param param
     * @return
     * @throws IOException
     */
    public static String doPost(String httpUrl, String param) throws IOException {
        //1.创建httpClient,httpPost对象 2.配置请求信息 3.执行post请求 4.获得httpEntity,进行字符转换 5.关闭资源
        String result;
        //这里使用HttpClient创建client,使用面向接口编程
        HttpClient httpClient = HttpClientBuilder.create().build();
        HttpPost httpPost = new HttpPost();
        httpPost.setConfig(RequestConfig.DEFAULT);
        httpPost.setEntity(new StringEntity(param));
        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        result = EntityUtils.toString(httpEntity);
        return result;
    }
 
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

little Chen1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值