Excel VBA POST格式问题

Excel VBA POST格式问题,excel,vba,post,Excel,Vba,Post,我正在尝试使用VBA发布到API。我有过去(与其他API一起)使用过的代码,它们的结构和格式都很有效。但这次并没有,似乎是发送命令造成的。所以我在网上搜索了一下,找到了一些关于如何设置发送格式的不同示例,我尝试了所有这些示例,但都不起作用 附带的代码示例包括我尝试过的几种格式化方法。除了一个,我把所有的都注释掉了,但把其他的都留在了注释中,以显示我的尝试。当您查看代码时,要知道我已经尝试了所有可能的注释代码组合 每次,我都会收到一个服务器响应,“没有上传文件,也没有提供URL或base 64。”

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

附带的代码示例包括我尝试过的几种格式化方法。除了一个,我把所有的都注释掉了,但把其他的都留在了注释中,以显示我的尝试。当您查看代码时,要知道我已经尝试了所有可能的注释代码组合

每次,我都会收到一个服务器响应,“没有上传文件,也没有提供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

你非常非常接近。这只是将正确的头和请求正文的正确格式结合起来的问题

应该是这样的:

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 在LinkedIn 6中对Facebook Twitter G*Google O Pinterest的评论 Reddit\r\n洛克希德公司的I-J-2S间谍飞机是出了名的难以驾驶 发射和着陆。他们极差的视野\r\n需要 在能跟上他们的地面上追车。\r\n他们使用一些 强大的交通工具,现在我们知道空军已经转向 全电动\r\n SLA型号S将启动其自己的spy 飞机。\r\n洛克希德公司的 IJ-2S\r\n设计于20世纪50年代。它一直是一个巨大的 操作困难,Mythbusters\r\n建议 可能是世界上“最难飞的飞机”。\r\n它们 需要一个完整的地面团队将i置于空中并\r\n返回地面 地面。\r\n美国空军使用了Camaro Z/28,它是\r\nJalopnik 在4年前的一篇文章中出现:\r\nbaaa.fun\r\n时间、测验、, 灵感\r\n有乐趣吗 现在!\r\nbaaa.fun\r\n,“ErrorMessage”:“ErrorDetails”:“}],“OCRExitCode”:1,“iErroredOnProcessing”:false,“ProcessingTimeinMills”:“621”,“SearchablePDFURL”:“Searchable 未生成PDF,因为未请求它。“}

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

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

注释中提到的括号问题在本例中不会产生任何影响,但它是一个有效的观点。

您不应该使用
),它只是
objHTTP.Send=“YourString”
(免责声明:我不知道这是否能解决您在这种情况下的问题,但将传递给过程的参数括起来是有意义的,并不是无害的)我以前没有处理过这个问题,但是快速搜索显示了这一点。您必须在您的情况下对其进行调整。如何调整?我不确定。没有时间测试它。我必须接近-您得到的响应正是我所期望的。但是,当我尝试您发布的代码时,在添加对WinHTTP的引用后,我得到以下错误:“运行时错误”-2147012894(80072ee2)“操作超时。似乎是在服务器端,所以我今天晚些时候会重试。谢谢你的建议!@Swannekin BTW如果你还没有注册获取免费API密钥,我想在发送10个请求后,服务器会阻止你一天。评论第一部分:@Stavros Jon非常感谢,你的建议非常有效,是的。”d我将问题标记为已回答。但这只是对可用的最简单方法的测试,即提供URL。我真正需要做的是将存储在本地计算机上的图像文件发送到API(这是一个OCR函数)。再一次,我尝试的一切都失败了,即使它在Postman中工作。我收到了相同的错误消息,没有上载任何文件。注释第2部分:我使用的发送请求,与您的请求类似,是:。发送“file=C:\Users\peter\Documents\image1.smalla.png&scale=true&language=eng&ocrEngine=2&isOverlayRequired=false&iscreatesearchablepdf=false&IsSearchablePDF=false&issearchablepdfhidetextlayer=false&istable=true”注释第3部分:当我查看Postman生成的代码时,它会显示“name=”file\“filename=”image1.smalla.png\”作为键和值,我不知道如何将额外的命名法(3个而不是2个)转换为正确的格式。我用完整的路径名和文件名进行了尝试。有什么想法吗?顺便说一句,API公司很好,但他们声称在VBA方面没有专业知识,所以他们无法提供任何见解。