Excel VBA POST格式问题
我正在尝试使用VBA发布到API。我有过去(与其他API一起)使用过的代码,它们的结构和格式都很有效。但这次并没有,似乎是发送命令造成的。所以我在网上搜索了一下,找到了一些关于如何设置发送格式的不同示例,我尝试了所有这些示例,但都不起作用 附带的代码示例包括我尝试过的几种格式化方法。除了一个,我把所有的都注释掉了,但把其他的都留在了注释中,以显示我的尝试。当您查看代码时,要知道我已经尝试了所有可能的注释代码组合 每次,我都会收到一个服务器响应,“没有上传文件,也没有提供URL或base 64。” 但是,如果我将相同的变量放入Postman并从那里发送,它工作得很好,因此我知道这不是API方面的错误,而是我格式化VBA的方式。我已经检查了很多次数据,以确保没有打字错误 如果有任何建议,我将不胜感激Excel VBA POST格式问题,excel,vba,post,Excel,Vba,Post,我正在尝试使用VBA发布到API。我有过去(与其他API一起)使用过的代码,它们的结构和格式都很有效。但这次并没有,似乎是发送命令造成的。所以我在网上搜索了一下,找到了一些关于如何设置发送格式的不同示例,我尝试了所有这些示例,但都不起作用 附带的代码示例包括我尝试过的几种格式化方法。除了一个,我把所有的都注释掉了,但把其他的都留在了注释中,以显示我的尝试。当您查看代码时,要知道我已经尝试了所有可能的注释代码组合 每次,我都会收到一个服务器响应,“没有上传文件,也没有提供URL或base 64。”
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方面没有专业知识,所以他们无法提供任何见解。