实战http请求

时间:2024-04-02 16:12:49

在这里插入图片描述

文章目录

  • 使用python3的标准库发起GET请求
  • 使用python3的标准库发起POST请求
  • 使用requests库发起GET请求
  • 使用requests库发起POST请求
  • 使用java 11内置的http client发起访问百度请求
  • 使用java 11内置的http client发起访问POST请求
  • 进一步阅读与参考资料

使用python3的标准库发起GET请求

在Python 3中,你可以使用内置的http.client模块来发起HTTP请求。这是Python标准库的一部分,无需安装额外的包。以下是如何使用http.client模块发起一个简单的GET请求的示例:

import http.client

# 指定目标主机和端口
host = 'www.example.com'
port = 80  # 对于HTTPS请求可以使用443

# 创建一个连接实例
connection = http.client.HTTPConnection(host, port)

# 发起GET请求
connection.request('GET', '/')

# 获取响应
response = connection.getresponse()

# 打印状态码和响应头
print(f'Status: {response.status} {response.reason}')
print(dict(response.getheaders()))

# 读取响应体
data = response.read()
print(data.decode('utf-8'))

# 关闭连接
connection.close()

在这个例子中:

我们创建了一个HTTP连接到www.example.com。
通过调用request方法发起了GET请求,指定要获取根路径’/'。
调用getresponse方法来获取服务器的响应。
打印出了HTTP状态码、状态描述和响应头。
读取响应体内容,并解码为字符串。
关闭了连接。
如果你需要发起HTTPS请求,可以使用http.client.HTTPSConnection类,并确保端口设置为443(如果未指定,默认也是443)。

请注意,上述代码没有处理任何异常。在实际应用中,你可能需要加入异常处理机制来处理网络错误、连接错误等情况。

对于更复杂的HTTP请求需求,例如发送POST请求、处理Cookies、重定向等,你可能需要手动构造请求头和消息体,并且管理连接的各个方面。对于这些高级特性,建议使用如requests这样的第三方库,它提供了更简洁且强大的API。不过,requests不是Python标准库的一部分,需要额外安装。

使用python3的标准库发起POST请求

在Python 3中,你可以使用内置的http.client模块来发起POST请求。以下是一个示例,展示了如何使用http.client模块发起一个带有表单数据的POST请求:

import http.client
import urllib.parse

# 指定目标主机和端口
host = 'www.example.com'
port = 80  # 对于HTTPS请求可以使用443

# 创建一个连接实例
connection = http.client.HTTPConnection(host, port)

# 准备要发送的表单数据
params = urllib.parse.urlencode({'key1': 'value1', 'key2': 'value2'})
headers = {
    'Content-type': 'application/x-www-form-urlencoded',
    'Accept': 'text/plain'
}

# 发起POST请求
connection.request('POST', '/post_endpoint', params, headers)

# 获取响应
response = connection.getresponse()

# 打印状态码和响应头
print(f'Status: {response.status} {response.reason}')
print(dict(response.getheaders()))

# 读取响应体
data = response.read()
print(data.decode('utf-8'))

# 关闭连接
connection.close()

在这个例子中:

  1. 我们使用urllib.parse.urlencode来将字典格式的表单数据编码为适合HTTP请求的格式。
  2. 定义了HTTP头信息,其中包括Content-type设置为application/x-www-form-urlencoded,这是大多数表单数据的提交格式。
  3. 通过调用request方法发起了POST请求,传入了请求方法、请求的资源路径、编码后的参数以及请求头。
  4. 获取并打印了响应状态码、原因短语和头信息。
  5. 读取了响应体内容,并对二进制数据进行解码,得到字符串形式的响应。
  6. 最后关闭了连接。

如果你需要通过HTTPS发起请求,可以使用http.client.HTTPSConnection类,它与HTTPConnection类的使用方式相同,但它会默认使用SSL/TLS加密。

同样,上述代码没有处理任何异常。在生产环境中,你应该添加异常处理代码来确保网络错误和连接问题得到妥善处理。对于更复杂的HTTP请求,尤其是涉及到文件上传、Cookies处理、持久化会话等,可能需要更高级的处理,这时候可以考虑使用第三方库例如requests。

使用requests库发起GET请求

在Python中,使用requests库发起GET请求是非常简单和直观的。首先,请确保你安装了requests库,如果还没有安装,可以通过pip来安装:

pip install requests

安装完成后,你可以写如下代码来发起一个GET请求:

import requests

# 指定URL
url = 'http://www.example.com'

# 发起GET请求
response = requests.get(url)

# 打印状态码
print(f'Status Code: {response.status_code}')

# 打印响应内容
print(response.text)

在这个示例中:

  1. 我们首先导入requests模块。
  2. 使用requests.get()函数,传入目标URL来发起一个GET请求。
  3. 打印出状态码,通常200表示请求成功。
  4. 最后打印出响应内容,response.text包含了响应体数据。

requests库提供了许多有用的特性,例如自动处理URL编码、自动解压缩响应体、简便的JSON响应处理等。如果响应是JSON格式的数据,你可以直接使用.json()方法来解析:

# 假设响应是JSON格式
json_data = response.json()
print(json_data)

requests库还提供了一个方便的方式来传递URL参数:

# URL参数字典
params = {
    'key1': 'value1',
    'key2': 'value2'
}

# 发起带有参数的GET请求
response = requests.get(url, params=params)

# 打印最终的URL(包括查询字符串)
print(f'Final URL: {response.url}')

在这个示例中,params参数在内部被转换成查询字符串,并附加到URL后面。使用requests库可以大大简化HTTP请求的过程,特别是对于需要处理复杂请求的场景。

使用requests库发起POST请求

使用Python的requests库发起POST请求同样是非常直接的。假设你需要发送一些表单数据,可以像这样进行:

import requests

# 指定请求的URL
url = 'http://www.example.com/post_endpoint'

# 准备表单数据
form_data = {
    'key1': 'value1',
    'key2': 'value2'
}

# 发起POST请求
response = requests.post(url, data=form_data)

# 打印状态码
print(f'Status Code: {response.status_code}')

# 打印响应内容
print(response.text)

在这个例子中,我们通过requests.post()方法发起一个POST请求。data参数是一个字典,它包含了我们要发送的表单数据。requests会自动将其编码为适合发送的格式(通常是application/x-www-form-urlencoded)。

如果你需要发送JSON数据,可以使用json参数:

import requests

# 准备JSON数据
json_data = {
    'key1': 'value1',
    'key2': 'value2'
}

# 发起POST请求,发送JSON数据
response = requests.post(url, json=json_data)

# 打印状态码和响应内容
print(f'Status Code: {response.status_code}')
print(response.text)

在使用json参数时,requests会自动将字典转换为JSON字符串,并且会设置正确的Content-Type头信息(application/json)。

如果你需要自定义请求头部,可以通过headers参数来实现:

import requests

headers = {
    'User-Agent': 'my-app/0.0.1',
    'Accept': 'application/json',
    'Authorization': 'Bearer token123'
}

response = requests.post(url, data=form_data, headers=headers)

# 打印状态码和响应内容
print(f'Status Code: {response.status_code}')
print(response.text)

在这个例子中,我们创建了一个自定义的请求头部字典,并将其作为headers参数传递给post方法。

requests还支持更高级的功能,比如文件上传、会话维持、代理支持等。例如,上传文件的处理可以这样:

files = {'file': open('report.xls', 'rb')}

response = requests.post(url, files=files)

# 打印状态码和响应内容
print(f'Status Code: {response.status_code}')
print(response.text)

在这个例子中,我们打开一个文件,并将其作为files参数的一部分。requests会为你处理文件的多部分编码(multipart/form-data)。

记得检查文档以了解requests库提供的所有功能,它是一个非常强大且易于使用的HTTP客户端库。

使用java 11内置的http client发起访问百度请求

在Java 11中,你可以使用内置的java.net.http包中的HttpClient类发起HTTP请求。以下是一个使用Java 11的HttpClient发起对百度的GET请求的示例:

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.io.IOException;
import java.util.concurrent.ExecutionException;

public class BaiduHttpClient {
    public static void main(String[] args) throws IOException, InterruptedException, ExecutionException {
        // 创建 HttpClient 实例
        HttpClient client = HttpClient.newHttpClient();

        // 创建 HttpRequest 实例,指定请求的URI
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://www.baidu.com"))
                .GET() // GET请求(默认)
                .build();

        // 发送请求并获取响应
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

        // 输出响应状态码
        System.out.println("Status Code: " + response.statusCode());

        // 输出响应体
        System.out.println("Response Body: " + response.body());
    }
}

在这个例子中:

  1. 我们使用HttpClient的newHttpClient方法创建了一个HttpClient实例。
  2. 我们使用HttpRequest的newBuilder方法创建了一个HttpRequest构建器实例,并配置了3. 请求URLhttps://www.baidu.com。
  3. 我们通过调用构建器的GET方法来指定这是一个GET请求,然后调用build方法来构建请求。
  4. 我们使用HttpClient的send方法发送请求,并指定HttpResponse.BodyHandlers.ofString()来处理响应体,这将响应体作为一个字符串返回。
  5. 我们打印出响应的状态码和响应体。

注意:这段代码需要处理两个异常:IOException和InterruptedException。IOException可能在发送HTTP请求或接收响应时发生,而InterruptedException则可能在等待响应时发生。

以上代码可以直接在支持Java 11的环境中编译和运行。如果你使用的是IDE,它应该能够自动处理这个例子中的所有导入。如果你是手动编译,确保使用的是Java 11或更高版本的JDK。

使用java 11内置的http client发起访问POST请求

在Java 11中,使用内置的HTTP客户端发起POST请求相对直接。以下是一个简单的例子,展示了如何使用java.net.http.HttpClient发起一个POST请求,将字符串数据发送到指定的服务器:

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;

public class SimplePostRequest {

    public static void main(String[] args) {
        // 创建HttpClient对象
        HttpClient client = HttpClient.newHttpClient();

        // 请求的URI
        String postEndpoint = "http://www.example.com/post";

        // POST请求的数据(这里使用简单的文本字符串作为示例)
        String requestBody = "key1=value1&key2=value2";

        // 构建HttpRequest对象
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(postEndpoint))
                .header("Content-Type", "application/x-www-form-urlencoded") // 设置Content-Type为表单数据
                .POST(HttpRequest.BodyPublishers.ofString(requestBody, StandardCharsets.UTF_8)) // 设置请求体
                .build();

        // 发送请求并接收响应
        try {
            HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

            // 输出响应状态码
            System.out.println("Status Code: " + response.statusCode());

            // 输出响应正文
            System.out.println("Response Body: " + response.body());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在这个例子中:

  1. 我们使用HttpClient.newHttpClient()创建了一个HttpClient实例。
  2. 我们创建了一个HttpRequest实例,通过HttpRequest.newBuilder()构造。我们将它的URI设为我们要POST到的地址。
  3. 通过header()方法设置了请求头Content-Type,表明我们正在发送表单数据。
  4. 使用POST()方法和HttpRequest.BodyPublishers.ofString()创建了请求体发布者,将字符串数据作为请求体。
  5. 使用client.send()方法同步发送HTTP请求,并使用6. HttpResponse.BodyHandlers.ofString()处理器来获取响应正文作为字符串。
  6. 我们打印出了HTTP响应的状态码和正文。

需要注意的是,示例代码中URL http://www.example.com/post 只是一个占位符,你应该替换为实际要发送POST请求的URL。同时,这个例子仅用于说明如何使用Java标准库发起POST请求,实际情况下,你可能需要根据服务端的要求来定制请求头,以及处理异常情况。

进一步阅读与参考资料

如果您想要深入了解如何使用Java 11中内置的HTTP客户端,以下是一些有用的资源和进一步的示例:

  1. 官方文档:
    Java 11的HttpClient类的官方文档是最权威的资源。您可以在Oracle官方文档中找到详细的API描述和使用方法。
    HttpClient (Java SE 11 & JDK 11 )
  2. 博客和教程:
    互联网上有很多博客和教程详细介绍了如何使用HttpClient。它们通常提供了实践示例和最佳实践。
    例如,Baeldung网站上的这篇教程详细介绍了如何使用新的HTTP客户端API:
    Guide to Java 11 HttpClient
  3. 视频教程:
    YouTube和其他视频教育平台上也有许多视频教程,可以帮助您通过视频演示来学习4. 5. HttpClient的使用。
    搜索“Java 11 HttpClient tutorial”可能会找到很多有用的视频教程。
    示例代码库:

随着Java 11的推出,很多现代Java编程书籍都涵盖了HttpClient。这些书籍可能不仅仅介绍API本身,还会介绍如何在现代Java应用中有效地使用它。
希望以上资料对您有所帮助,如果有特定的问题或者需要更详细的例子,请随时提问。