pecl_http在hotelbeds apitude中添加帖子请求正文

时间:2016-08-01 16:06:01

标签: php xml pecl

最近我开始使用hotelbeds apitude PHP API

我正在尝试使用xmlPOST代码添加到pecl_http请求正文中。我尝试使用以下代码 -

$xml_part = <<< EOD
                <<<XML PART>>> EOD;

$request = new http\Client\Request("POST",
                    $endpoint,
                    ["Api-Key" => $hotel_beds_config['api_key'],
                        "X-Signature" => $signature,
                        "Content-Type" => "application/xml",
                        "Accept" => "application/xml"],
                    $xml_part
                );

我收到以下错误

  

致命错误:未捕获TypeError:传递给http \ Client \ Request :: __ construct()的参数4必须是http \ Message \ Body的字符串实例,字符串   给定

然后我尝试使用以下代码 -

$request = new http\Client\Request("POST",
                    $endpoint,
                    ["Api-Key" => $hotel_beds_config['api_key'],
                        "X-Signature" => $signature,
                        "Content-Type" => "application/xml",
                        "Accept" => "application/xml"],
                    new http\Message\Body($xml_part)

现在我收到以下错误 -

  

致命错误:未捕获http \ Exception \ InvalidArgumentException:http \ Message \ Body :: __ construct()期望参数1为资源,字符串为

我在这里获得了添加正文消息的文档 -

pecl_http

如何将xml代码添加到POST请求?

1 个答案:

答案 0 :(得分:0)

根据http\Message\Body::__construct() constructor documentation,它可选择接受的单个参数是流或文件句柄资源(如fopen()中所示)。它不会像您在$xml_part中提供的那样直接接受字符串数据。

相反,pecl http在Body类上提供了an append() method,您应该可以使用它将XML附加到空体上。首先,在变量中创建一个Body对象,然后将XML附加到其上。最后,将Body对象传递到Request对象。

// Create a Body object first, with no argument
$body = new http\Message\Body();
// Append your XML to it
$body->append($xml_part);

// Create the Request and pass $body to it
$request = new http\Client\Request("POST",
                $endpoint,
                ["Api-Key" => $hotel_beds_config['api_key'],
                    "X-Signature" => $signature,
                    "Content-Type" => "application/xml",
                    "Accept" => "application/xml"],
                // Pass in $body
                $body
            );

// Create an \http\Client object, enqueue, and send the request...
$client = new \http\Client();
// Set options as needed for your application...
$client->enqueue($request);
$client->send();

附录:为什么不使用SDK?

您尝试发布到provides a PHP SDK的API。如果SDK支持您希望使用的可用性功能,那么使用它可能更简单,而不是pecl_http(其文档有限)。然后,SDK会将所有HTTP消息传递抽象为一系列PHP方法和属性,从而消除对正确构造POST请求的任何疑问。