您的位置:

关于urllib3的TypeError(f"'body' must be a bytes-like object, file-like "f"object, or iterable. Instead was {body!r}") from None

  发布时间:2025-02-28 16:35:27
本文介绍了导致urllib3出现TypeError的原因和解决方案,主要是传递给请求的body参数类型不符合要求。提供了转换字符串为字节对象、打开文件并读取内容、确保可迭代对象元素为字节对象等解决方法。同时给出了使用urllib3发送POST请求的具体示例。

问题原因

导致urllib3出现TypeError(f"'body' must be a bytes-like object, file-like "f"object, or iterable. Instead was {body!r}") from None的原因是传递给请求的body参数的类型不符合要求。urllib3要求body参数必须是类似字节对象、类文件对象或可迭代对象。如果body参数的类型不是这些之一,就会导致出现这个错误。

解决方案

该错误通常是由于使用urllib3发送请求时,body参数的类型不正确导致的。body参数应该是一个字节类似对象(bytes-like object)、类文件对象(file-like object)或可迭代对象(iterable)。 要解决这个问题,确保body参数的类型符合要求。以下是几种可能的解决方案: 1. 如果body是字符串,需要将其转换为字节类似对象。可以使用str.encode()方法将字符串转换为字节类似对象。


body_bytes = body.encode('utf-8')
  1. 如果body是文件对象,确保文件已经以二进制模式打开,并且读取文件内容作为字节类似对象。

with open('file.txt', 'rb') as file:
    file_content = file.read()
  1. 如果body是列表或其他可迭代对象,确保其中的每个元素都是字节类似对象。

body_list = [b'part1', b'part2']  # 以字节类似对象构成的列表

通过以上方法,您可以确保body参数的类型正确,从而避免出现TypeError异常。

具体例子

urllib3出现TypeError(f"'body' must be a bytes-like object, file-like "f"object, or iterable. Instead was {body!r}") from None 是因为在使用urllib3时传入的body参数类型不正确导致的错误。要正确使用urllib3,需要确保传入的body参数是bytes-like对象、类文件对象或可迭代对象。 下面是一个关于如何正确使用urllib3的示例:


import urllib3

# 创建一个PoolManager实例
http = urllib3.PoolManager()

# 发送POST请求
url = 'https://httpbin.org/post'
data = {'key': 'value'}

# 在这里我们要确保data参数是合适的,需要将其转换为bytes类型
encoded_data = urllib3.request.urlencode(data)
r = http.request('POST', url, body=encoded_data)

# 打印请求的状态码和响应内容
print(r.status)
print(r.data.decode('utf-8'))

在上面的示例中,我们首先创建了一个PoolManager实例,然后发送了一个POST请求到 https://httpbin.org/post,我们将data参数转换为了bytes类型并传入了body参数。这样就避免了TypeError(f"'body' must be a bytes-like object, file-like "f"object, or iterable. Instead was {body!r}") from None 这个错误的出现。