调用Google Translate API遇411错误,如何添加Content-Length请求头?
解决Google Translate API翻译超长文本时的HTTP 411错误
遇到这个HTTP 411错误很常见,通常是因为超长文本触发了客户端的分块传输编码,而服务器端要求必须携带Content-Length请求头。下面给你具体的解决方法,包括如何添加请求头,以及正确计算长度的方式:
一、核心原理:计算Content-Length的正确方式
Content-Length对应的是请求体的字节数,不是文本的字符数。所以计算时需要把文本转换成UTF-8编码的字节流,再取长度:
# 计算文本的UTF-8字节长度 content_length = len(text.encode('utf-8'))
这个数值就是你需要填入Content-Length头的内容。
二、在Google Translate Python客户端中添加Content-Length头
官方的google-cloud-translate客户端基于requests库,我们可以通过自定义Session来自动为所有请求添加Content-Length头,避免手动处理每个请求:
import requests from google.cloud import translate import six # 自定义Session,自动添加Content-Length头 class CustomTranslateSession(requests.Session): def prepare_request(self, request): # 先让父类完成请求准备 prepared_request = super().prepare_request(request) # 只有当请求有body且未设置Content-Length时才添加 if prepared_request.body and not prepared_request.headers.get('Content-Length'): # 计算请求体的字节长度 body_length = len(prepared_request.body) prepared_request.headers['Content-Length'] = str(body_length) return prepared_request def translate_text(text, target): # 使用自定义Session初始化翻译客户端 translate_client = translate.Client(session=CustomTranslateSession()) if isinstance(text, six.binary_type): text = text.decode('utf-8') result = translate_client.translate( text, target_language=target) print(u'Text: {}'.format(result['input'])) print(u'Translation: {}'.format(result['translatedText'])) print(u'Detected source language: {}'.format( result['detectedSourceLanguage'])) # 替换为你的超长文本 txtTranslate = 'a long long text...' conteudo = translate_text(txtTranslate, target='pt')
代码说明:
- 我们继承了
requests.Session并重写了prepare_request方法,在请求发送前自动检查并添加Content-Length头; - 这种方式对所有通过该客户端发送的请求生效,不用每次调用
translate都手动处理; - 为什么不直接手动设置?因为客户端内部会处理请求体的编码和组装,自定义Session能确保我们拿到的是最终发送的请求体字节长度,避免计算错误。
三、为什么会出现这个错误?
当文本长度超过一定阈值时,requests库默认会使用分块传输编码(Transfer-Encoding: chunked),此时不会自动添加Content-Length头。但部分服务器配置要求必须携带这个头,就会返回HTTP 411错误。通过强制添加Content-Length,我们可以绕过分块传输,改用固定长度的请求体格式。
内容的提问来源于stack exchange,提问作者Eduardo Sena
相关产品推荐
相关产品推荐

