You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 13:37:26