如何在httr::POST()中设置Host、Content-Type及订阅密钥?
解决
httr::POST()调用Azure Form Recognizer发票分析API的400错误问题 问题分析
你遇到的400错误主要来自以下几个问题:
- 图片二进制数据处理错误:用
png::readPNG()读取的是图像像素矩阵,转成raw格式后不符合API要求的原始文件流。 - HTTP版本配置未生效:虽然指定了
http_version=1.1,但请求仍以HTTP/1.0发送(从verbose日志可见),可能导致API兼容性问题。 - 冗余请求头:手动添加
Host头是多余的,httr会自动根据URL生成该头,无需手动设置。 - 端点路径异常:日志显示请求被路由到v2.1版本的旧端点,而非你指定的2022-06-30-preview版本端点,可能是URL参数或配置问题。
修正后的代码
直接上传本地图片文件时,应使用httr的文件上传机制,确保原始文件流正确传递,同时修正HTTP版本配置:
library(httr) # 正确的API端点URL url <- "https://germanywestcentral.api.cognitive.microsoft.com/formrecognizer/documentModels/prebuilt-invoice:analyze?api-version=2022-06-30-preview&stringIndexType=textElements" # 读取本地图片文件(直接用file()获取原始流) img_file <- file("./images/2.png", "rb") # 发送POST请求 response <- POST( url = url, add_headers( `Ocp-Apim-Subscription-Key` = "你的订阅密钥", `Content-Type` = "image/png" ), body = list(file = img_file), config = config(http_version = 1.1), verbose() ) # 关闭文件连接 close(img_file) # 查看响应内容 content(response, "parsed")
关键修改点说明
- 文件读取方式:用
file()以二进制模式打开文件,直接作为请求体的文件参数,避免像素矩阵转raw的错误处理。 - 请求体格式:通过
list(file = img_file)告知httr以multipart/form-data格式上传文件,符合API对本地文件上传的要求。 - 移除冗余头:删除手动设置的
Host头,由httr自动处理。 - HTTP版本强制:确保
config(http_version = 1.1)正确生效,避免HTTP版本不兼容导致的问题。
额外提示
如果仍出现错误,建议:
- 检查订阅密钥是否有效,以及区域是否与端点匹配(germanywestcentral)。
- 确认图片文件路径正确,文件未损坏。
- 查看
content(response, "text")获取详细的错误信息,API通常会返回具体的错误原因。
内容的提问来源于stack exchange,提问作者Asitav Sen
相关产品推荐
相关产品推荐

