REST API с POST и XML в PHP возвращает false, когда не должно?

#php #xml #api #rest #post

#php #xml #API #rest #Публикация

Вопрос:

Итак, создатели этого API четко обозначили мой код как функциональный, поскольку они создали эту чертову штуку. Дело в том, что REST API работает нормально, пока я использую только PI или QS. Когда я пытаюсь использовать более продвинутые функции, требующие отправки XML-документа с запросом REST, он просто возвращает false при выполнении.

 <?php

$objCurlToken = curl_init();
$strUrlToken = "https://servername/apimember/services/rest/connect/open/username/password/token";
$arrCurlOptions1 = array(
    CURLOPT_URL => $strUrlToken,
    CURLOPT_RETURNTRANSFER => true
);
curl_setopt_array($objCurlToken, $arrCurlOptions1);
$strXMLToken = curl_exec($objCurlToken);
$objXML = simplexml_load_string($strXMLToken);
curl_close($objCurlToken);


$strXMLPost = '
<?xml version="1.0" encoding="utf-8"?>
<synchroMember>
    <memberUID>
        EMAIL
    </memberUID>
    <dynContent>
        <entry>
            <key>
                EMAIL
            </key>
            <value>
                klaus@lagerbrau.de
            </value>
        </entry>
        <entry>
            <key>
                FIRSTNAME
            </key>
            <value>
                KLAUS LAGER
            </value>
        </entry>
        <entry>
            <key>
                EMVADMIN1
            </key>
            <value>
                This is klaus lager, the test subject
            </value>
        </entry>
    </dynContent>
</synchroMember>
';
$objCurlProbe = curl_init();
$strUrlProbe = "https://servername/apimember/services/rest/member/insertOrUpdateMember/" . $objXML->result . "";
$arrCurlOptions2 = array(
    CURLOPT_URL => $strUrlProbe,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $strXMLPost
);
curl_setopt_array($objCurlProbe, $arrCurlOptions2);
$strCurlXMLResult = curl_exec($objCurlProbe);
echo "<pre>";
var_dump(htmlentities($objXML->result));
var_dump(htmlentities($strXMLPost));
var_dump(htmlentities($strCurlXMLResult));
curl_close($objCurlProbe);
$objXMLResult = simplexml_load_string($strCurlXMLResult);
var_dump($objXMLResult);
?>
  

Результат выглядит следующим образом:

 string(84) "*tokenkey*"
string(615) "
<?xml version="1.0" encoding="utf-8"?>
<synchroMember>
    <memberUID>
        EMAIL
    </memberUID>
    <dynContent>
        <entry>
            <key>
                EMAIL
            </key>
            <value>
                klaus@lagerbrau.de
            </value>
        </entry>
        <entry>
            <key>
                FIRSTNAME
            </key>
            <value>
                KLAUS LAGER
            </value>
        </entry>
        <entry>
            <key>
                EMVADMIN1
            </key>
            <value>
                This is klaus lager, the test subject
            </value>
        </entry>
    </dynContent>
</synchroMember>
"
string(0) ""
bool(false)
  

Взято из документации API:

 ***Insert or Update Member Data***
This method searches a specified column of the Member table for a particular value used to identify a member
in order to update the member's data. If the member is not found, a new member is created. Any criteria can
be used to find the member including one of the fields to be updated.
The memberUID attribute is used to specify the key and value used as search criteria. The dynContent attribute
should only contain the values to be updated.
**insertOrUpdateMember**
***Input***
https://{server}/apimember/services/rest/member/insertOrUpdateMember/{token}
<?xml version="1.0" encoding="utf-8"?>
<synchroMember>
<memberUID>
{fieldNameA},
{fieldNameB}
</memberUID>
<dynContent>
<entry>
<key>>
{fieldNameA}
</key>
<value>
{fieldValueA}
</value>
</entry>
<entry>
<key>
{fieldNameB}
</key>
<value>
{fieldValueB}
</value>
</entry>
<entry>
<key>
{fieldNameC}
</key>
<value>
{fieldValueC}
</value>
</entry>
</dynContent>
</synchroMember>
  

Комментарии:

1. «ПИ»? «QS»? Я не понимаю. Что это за API? Вероятно, мы не сможем помочь вам, не зная этого и не имея некоторой документации.

2. QS: Строка запроса, PI: Информация о пути, используемая для описания двух наиболее распространенных способов использования REST, QS использует переменные get, а PI использует переменные path. API предназначен для чего-то, что называется EmailVision. Редактировать: Опубликовал часть документации, которую я пытаюсь использовать ниже.

Ответ №1:

Я обнаружил проблему, проблема заключалась в отсутствующем заголовке, описывающем документ как XML. Насколько я знаю, это не должно быть проблемой на обычных серверах REST, поскольку единственной принятой формой данных является XML. Что не помогло, так это то, что компания довольно ужасна в разработке программного обеспечения, поэтому система никогда не отвечает ошибками, а если и отвечает, они не читаются человеком, и компания не предоставляет список кодов ошибок.