【问题标题】:httr POST API request but missing xml parameterhttr POST API 请求但缺少 xml 参数
【发布时间】:2015-12-04 13:40:52
【问题描述】:

我正在尝试使用httr 连接到 IBM Silverpop 的 XML API,但我遇到了“缺少 XML 参数”的问题。我尝试使用 Silverpop 提供的测试工具来查看我发送的请求与我通过 httr 发送的请求相比是否不同,但没有找到任何可以帮助我的东西。

以下是我使用 测试工具 成功发送的XML 正文:

<Envelope><Body>
<Login>
<USERNAME>My Email</USERNAME>
<PASSWORD>My password</PASSWORD>
</Login>
</Body></Envelope>

使用 Chrome 检查请求标头(使用CTRL + SHIFT + I):

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate
Accept-Language:en-US,en;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Content-Length:225
Content-Type:application/x-www-form-urlencoded
Host:api3.silverpop.com
Origin:null
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36

再次,使用 Chrome 检查响应标头

Connection:Keep-Alive
Content-Type:text/xml;charset=utf-8
Date:Fri, 04 Dec 2015 12:15:34 GMT
Keep-Alive:timeout=15, max=100
Server:Apache-Coyote/1.1
Transfer-Encoding:chunked

使用httr,我构造我的请求如下:

library(httr)

ibmUrl <- "api3.silverpop.com/XMLAPI"

body1 <- "<Envelope><Body>
<Login>
<USERNAME>My Email</USERNAME>
<PASSWORD>My password</PASSWORD>
</Login>
</Body></Envelope>"

test1 <- POST(url = ibmUrl, body = body1, verbose(), content_type("application/x-www-form-urlencoded"))

使用verbose() 表示正在发送和接收以下内容:

-> POST /XMLAPI HTTP/1.1
-> Host: api3.silverpop.com
-> User-Agent: libcurl/7.43.0 r-curl/0.9.3 httr/1.0.0
-> Accept-Encoding: gzip, deflate
-> Accept: application/json, text/xml, application/xml, */*
-> Content-Type: application/x-www-form-urlencoded
-> Content-Length: 132
-> 
>> <Envelope><Body>
>> <Login>
>> <USERNAME>My Email</USERNAME>
>> <PASSWORD>My password</PASSWORD>
>> </Login>
>> </Body></Envelope>

<- HTTP/1.1 200 OK
<- Date: Fri, 04 Dec 2015 13:29:55 GMT
<- Server: Apache-Coyote/1.1
<- Content-Type: text/xml
<- Content-Length: 255

但是当我使用 content() 检查来自 API 的响应时,我得到以下信息:

<?xml version="1.0"?>
<Envelope>
  <Body>
    <RESULT>
      <SUCCESS>false</SUCCESS>
    </RESULT>
    <Fault>
      <Request/>
      <FaultCode/>
      <FaultString>Missing 'xml'parameter</FaultString>
      <detail>
        <error>
          <errorid>52</errorid>
          <module/>
          <class>SP.API</class>
          <method/>
        </error>
      </detail>
    </Fault>
  </Body>
</Envelope>

怎么会?

提前致谢。

【问题讨论】:

    标签: xml r rcurl httr


    【解决方案1】:

    我想我找到了答案 - 虽然不太确定为什么会这样,而且我在问题中显示的最初尝试没有......

    这是我的原始代码:

    test1 <- POST(url = ibmUrl, body = body1, 
    verbose(), content_type("application/x-www-form-urlencoded"))
    

    我只需要将 content_type 更改为“text/xml”。

    test1 <- POST(url = ibmUrl,
            body = body1, verbose(), content_type("text/xml"))
    

    它有效...但是如果有人能插话并澄清为什么这可以解决问题...

    【讨论】:

    • @hadley(尴尬),但我只是在复制浏览器发送的原始请求形式。我认为同样会使用 httr 发送?感谢您的回复。
    • 我知道这很旧,但我偶然发现了一个非常相似的问题,结果他们似乎只接受“text/xml”而不接受“application/xml”。因此 content_type_xml() 失败并出现奇怪的错误消息“缺少 xml 参数”:)
    • 另外,要直接从 Silverpop 的 xml_api_developer_guide 中回答问题:“如果将 XML 作为 URL 参数 (xml=) 传递,则必须对 XML 进行 URL 编码并指定它是 URL 编码的 (内容类型:application/x-www-form-urlencoded)。”所以我认为这就是测试工具的作用。
    • @info_seekeR 是的,但未来的人们可能仍然会偶然发现它并想知道同样的事情。六个月并没有那么长,尤其是考虑到我们的 Silverpop 霸主当时并没有改变 Api 或其文档的任何内容。
    • 哇,这拯救了我的一天。即使我被困在同一个问题上,虽然我正在尝试使用 php。我所做的只是将application/xml 更改为text/xml。非常感谢@info_seekeR
    猜你喜欢
    • 1970-01-01
    • 2019-04-04
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多