【问题标题】:VBA POST formatting issueVBA POST 格式问题
【发布时间】:2019-08-29 15:29:19
【问题描述】:

我正在尝试使用 VBA 发布到 API。我有过去使用过的代码(与其他 API 一起使用),其结构和格式都有效。但这次没有,罪魁祸首似乎是发送命令。所以我在网上搜索并找到了一些关于如何格式化发送的不同示例,我已经尝试了所有这些示例,但它们都不起作用。

随附的代码示例包括我尝试格式化的几种方式。我已经注释掉了除一个之外的所有内容,但将其他内容留在了 cmets 中以显示我尝试过的内容。当您查看代码时,请知道我已经尝试了所有可能的注释掉代码的组合。

每次,我都会收到“未上传文件或提供 URL 或 base 64”的服务器响应。

但是,如果我将相同的变量放入 Postman 并从那里发送,它工作正常,所以我知道这不是 API 端的错误,这是我格式化 VBA 的方式。我已经多次检查数据以确保没有错别字。

如果有任何建议,我将不胜感激。

    Sub macroPOST()
      Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
      Url = "https://api.ocr.space/parse/image"

       objHTTP.Open "POST", Url, False

      'objHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
      objHTTP.setRequestHeader "apikey", "helloworld"
      objHTTP.setRequestHeader "Content-Type", "multipart/form-data"
      'objHTTP.setRequestHeader "Content-Type", "image/png"

      objHTTP.Send ("url=http://dl.a9t9.com/ocrbenchmark/eng.png&filetype=PNG&language=eng&isOverlayRequired=false&iscreatesearchablepdf=false&issearchablepdfhidetextlayer=false")
      'objHTTP.Send ("url=http://dl.a9t9.com/ocrbenchmark/eng.png")
      'objHTTP.Send ("url%3Dhttp%3A%2F%2Fdl%2Ea9t9%2Ecom%2Focrbenchmark%2Feng%2Epng")
      BodyContent = "{" & Chr(34) & "url" & Chr(34) & ":" & Chr(34) & "http://dl.a9t9.com/ocrbenchmark/eng.png" & Chr(34) & "}"
      'objHTTP.Send (BodyContent)

      replyTXT = objHTTP.responseText

      If objHTTP.Status = "200" Then 'success
        MsgBox replyTXT
      Else
        MsgBox ("Problem")
      End If
    End Sub

【问题讨论】:

  • 你不应该在那里使用(。只是objHTTP.Send = "YourString"(免责声明:我不知道在这种情况下这是否会解决您的问题,但是传递给过程的括号参数是有意义的,并且不是无害的)
  • 我以前没有使用过这个,但快速搜索显示curl is smart enough to read the file and upload the contents with your request。您将不得不根据您的情况对其进行调整。如何?我不知道。没有时间测试它。

标签: excel vba post


【解决方案1】:

你们非常亲近。只需将正确的标头和请求正文的正确格式结合起来即可。

应该是这样的:

Option Explicit

Sub test()
Dim req As New WinHttpRequest 'add a reference to Microsoft WinHTTP Services version 5.1
Dim url As String
url = "https://api.ocr.space/parse/image"

With req
    .Open "POST", url, False
    .setRequestHeader "apikey", "helloworld"
    .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    .send "url=http://dl.a9t9.com/ocrbenchmark/eng.png"
    Debug.Print .responseText
    Debug.Print .Status
End With
End Sub

JSON 中的响应如下:

{"ParsedResults":[{"TextOverlay":{"Lines":[],"HasOverlay":false,"Message":"Text 没有提供覆盖,因为它不是 请求"},"TextOrientation":"0","FileParseExitCode":1,"ParsedText":"ELLIOT\r\n29 Facebook Twitter G* Google O Pinterest 在 LinkedIn 中的评论 6 Reddit\r\n洛克希德的 I-J-2S 间谍飞机是出了名的难 发射和着陆。他们极差的\r\n视野需要 在地面上追逐可以跟上他们的汽车。\r\n他们使用一些 强大的车辆,现在我们了解到空军已经转向 全电动\r\n特斯拉 Model S 推出自己的间谍 飞机。\r\n虽然它今天仍在使用,但洛克希德 IJ-2S\r\n 设计于 1950 年代。它一直是一个\r\n非常 难以操作的飞机和流言终结者\r\n甚至建议它 可能是“世界上最难飞的\r\n飞机”。\r\n他们 需要一整个地面团队将 i 置于空中并\r\n返回 地面。\r\n美国空军使用了 Camaro Z/28,\r\nJalopnik 4 年前的一篇文章中精选:\r\ nbaaa.fun\r\nmemes, quizzes, 灵感\r\n玩得开心 现在!\r\nbaaa.fun\r\n","ErrorMessage":"","ErrorDetails":""}],"OCRExitCode":1,"IsErroredOnProcessing":false,"ProcessingTimeInMilliseconds":"621", "SearchablePDFURL":"可搜索 未生成 PDF,因为它没有被请求。"}

现在,如果您需要在请求中包含更多可选参数,您可以像这样构造它的主体:

.send "url=http://dl.a9t9.com/ocrbenchmark/eng.png&language=eng&isOverlayRequired=false&filetype=jpg&iscreatesearchablepdf=false&issearchablepdfhidetextlayer=false"

在 cmets 中提到的括号问题在这种情况下不会产生影响,但它仍然是一个有效的观点。

【讨论】:

  • 我必须接近了 - 你得到的回应是我所期待的。但是当我尝试您发布的代码时,在添加对 WinHTTP 的引用后,我收到此错误:“运行时错误 '-2147012894(80072ee2)' 操作超时。似乎在服务器端,所以我今天稍后再试。感谢您的建议!
  • @Swannekin BTW 如果你还没有注册以获得免费的 API 密钥,我认为服务器会在发送 10 个请求后阻止你一天。
  • 评论第 1 部分:@Stavros Jon 非常感谢您,您的建议非常有效,我将问题标记为已回答。但这只是对提供 URL 的最简单方法的测试。我真正要做的是将存储在本地机器上的图像文件发送到 API(这是一个 OCR 函数)。再一次,我尝试的一切都失败了,即使它在 Postman 中工作。我收到相同的错误消息,没有上传文件。
  • 评论第 2 部分:我使用的发送请求,模仿你的,是:.send "file=C:\Users\peter\Documents\image1.smalla.png&scale=true&language=eng&ocrEngine=2&isOverlayRequired= false&iscreatesearchablepdf=false&issearchablepdfhidetextlayer=false&istable=true"
  • 评论第 3 部分:当我查看 Postman 生成的代码时,它显示 "name=\"file\"; filename=\"image1.smalla.png\" 作为键和值,并且我不确定如何将额外的命名法(3 件事而不是 2 件事)翻译成正确的格式。而且我已经尝试使用完整的路径名和文件名。有什么想法吗?P.S. API 公司非常好,但他们声称没有 VBA 专业知识,因此无法提供任何见解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多