2015-12-04 9 views
1

Я пытаюсь подключиться к XML-API для IBM Silverpop, используя httr, но я столкнулся с проблемой «отсутствия XML-параметра». Я попробовал использовать тестовый жгут, предоставленный Silverpop, чтобы узнать, отличаются ли посылки от того, что я отправляю через httr, но не нашли ничего, что могло бы мне помочь.httr Запрос API POST, но отсутствует параметр xml

Ниже приводится 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 

Но когда я проверить ответ от API с помощью content(), я получаю следующее:

<?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> 

Почему?

Заранее спасибо.

ответ

2

Я думаю, что я нашел ответ - хотя и не совсем уверен, почему это работает и моя первоначальная попытка показано в этом вопросе не ...

Это был мой исходный код:

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")) 

И это работает ... Но был бы благодарен, если кто-нибудь может куранты в и выяснить, почему это решает проблему ...

+2

Поскольку вы отправляете XML не образуют кодированные данные? – hadley

+0

@hadley (смущенный), но я только копировал необработанную форму запроса, отправляемого моим браузером. Я думал, что то же самое будет отправлено с помощью httr? Спасибо за ответ. –

+1

Я знаю, что это старый, но я просто наткнулся на очень похожую проблему, и получается, что они, кажется, принимают только текст/xml, а не «application/xml». Поскольку такой content_type_xml() терпит неудачу с любопытным сообщением об ошибке «missing xml parameter» :) – DeVadder

 Смежные вопросы

  • Нет связанных вопросов^_^