【发布时间】:2021-12-14 04:18:39
【问题描述】:
我的 Access 和 VBA 相当不错,但对 XML 和 http 请求的接触有限。 我正在尝试通过使用以下代码执行 HTTP POST 来返回一些 XML 结构化数据。 (如果我的措辞不正确,我深表歉意)
这是我得到的错误:
{"message":"Request could not be processed","details":null,"responseCode":500,"code":null,"target":null}
最初我遇到了 API 密码失败的问题,现在我已经克服了那个错误并且知道这是正确的。
- 谁能发现我做错了什么?
- 这可能是我构建 XML 的方式
- 请求 XML 是否还应包含标头信息,而其他标头信息用于响应?
- 我需要这个
objXML.async = False我只是从别人的代码中复制的
Sub MFGetRate()
'Add a reference to Microsoft XML v6.0 via Tools > References
Dim sGetResult As String
Dim httpObject As Object
Dim objXML As Object
Dim sXML As String
Dim apiURL As String
Set objXML = CreateObject("msxml2.DOMDocument.6.0")
Set httpObject = CreateObject("msxml2.serverxmlhttp.6.0")
objXML.async = False
sXML = "<rate>"
sXML = sXML & "<account>"
sXML = sXML & "<code>XXXX</code>"
sXML = sXML & "</account>"
sXML = sXML & "<serviceLevel>"
sXML = sXML & "<code>M2H</code>"
sXML = sXML & "</serviceLevel>"
sXML = sXML & "<origin>"
sXML = sXML & "<freightRequiredDateTime>2021-11-04T17:33:10</freightRequiredDateTime>"
sXML = sXML & "<freightRequiredDateTimeZone>New Zealand Standard Time</freightRequiredDateTimeZone>"
sXML = sXML & "<address>"
sXML = sXML & "<suburb>Rosedale</suburb>"
sXML = sXML & "<postCode>0000</postCode>"
sXML = sXML & "<town/>"
sXML = sXML & "<city>Auckland</city>"
sXML = sXML & "<stateCode/>"
sXML = sXML & "<countryCode>NZ</countryCode>"
sXML = sXML & "</address>"
sXML = sXML & "</origin>"
sXML = sXML & "<destination>"
sXML = sXML & "<address>"
sXML = sXML & "<suburb>XXXXXX</suburb>"
sXML = sXML & "<postCode>0000</postCode>"
sXML = sXML & "<town/>"
sXML = sXML & "<city>XXXXXX</city>"
sXML = sXML & "<stateCode/>"
sXML = sXML & "<countryCode>NZ</countryCode>"
sXML = sXML & "</address>"
sXML = sXML & "</destination>"
sXML = sXML & "<freightDetails>"
sXML = sXML & "<units>1</units>"
sXML = sXML & "<packTypeCode>CTN</packTypeCode>"
sXML = sXML & "<height/>"
sXML = sXML & "<length/>"
sXML = sXML & "<width/>"
sXML = sXML & "<weight>30</weight>"
sXML = sXML & "<volume>.1</volume>"
sXML = sXML & "</freightDetails>"
sXML = sXML & "</rate>"
objXML.Load (sXML)
apiURL = "https://api.mainfreight.com/transport/1.0/Customer/Rate?region=NZ"
sRequest = apiURL
httpObject.Open "POST", sRequest, False
httpObject.setRequestHeader "Content-Type", "application/xml; charset=utf-8"
httpObject.setRequestHeader "Authorization", "Secret XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
httpObject.Send objXML.XML
sGetResult = httpObject.responseText
Debug.Print sGetResult
End Sub
【问题讨论】:
-
基于API documentation(如果您可以在您的问题中提供相关文档,那就太好了,这样我们就不必谷歌了...),您似乎缺少@
<freightDetails>标签内的 987654327@ 标签。尝试在sXML = sXML & "<units>1</units>"之前插入sXML = sXML & "<freightDetail>"和sXML = sXML & "</freightDetail>"在sXML = sXML & "</freightDetails>"之前 -
你也许可以直接传递
sXML,即httpObject.Send sXML -
使用 API 测试工具如 {Postman](postman.com)) 会有所帮助,因为那里很容易修改请求参数。一旦你找到了一些被证明可以与你的 API 一起工作的东西,你就会确切地知道用 XmlHttpRequest 重新实现什么。
-
您尚未将所需的“Accept”标头添加到 POST 请求中。 developer.mainfreight.com/global/en/global-home/transport-api/…
-
@RaymondWu - 你是对的。在手机上我只看到“你必须添加”,并没有向右滚动……
标签: xml vba http ms-access post