如何使用Laravel将带有Guzzle的XML POST请求发送到Web服务API?

时间:2019-02-01 10:46:18

标签: web-services laravel-5 guzzle

我正在尝试使用Laravel Guzzle Http客户端将请求发布到我的Web API。但是,尝试发布请求时遇到错误。我要发送的数据是XML,因为API控制器以XML返回格式构建。

我已经尝试了各种方法来用Guzzle发布请求,但该请求尚未起作用。

public function createProperty(Request $request)
 {
    $client = new Client();

    $post = $request->all();


    $create = $client->request('POST', 'http://127.0.0.1:5111/admin/hotel', [
        'headers' => [
            'Content-Type' => 'text/xml; charset=UTF8',
        ],
        'form-data' => [
           'Name'           => $post['hotel_name'],
           'Address'        => $post['address'],
           'Phone'          => $post['phone'],
           'Email'          => $post['email'],
           'Website'        => $post['website'],
           'Latitude'       => $post['latitude'],
           'Longitude'      => $post['longitude'],
           'Tags'           => $post['tags'],
           'Priority'       => $post['priority'],
           'Visible'        => $post['visible'],
           'Stars'          => $post['stars'],
           'Description'    => $post['description'], 
           'Facilities'     => $post['facilities'],
           'Policies'       => $post['policies'],
           'ImportantInfo'  => $post['important_info'],
           'MinimumAge'     => $post['minimum_age']
       ]                            
    ]);
    //dd($create->getBody());

    echo $create->getStatusCode();
    echo $create->getHeader('content-type');
    echo $create->getBody();
    $response = $client->send($create);

    $xml_string = preg_replace('/(<\?xml[^?]+?)utf-16/i', '$1utf-8', $create->getBody());
    $xml_string = $create->getBody();
    //dd($xml_string);
    $hotels = simplexml_load_string($xml_string);

    return redirect()->back();
}

我希望将结果发布到Web服务并将数据保存到数据库,但是我收到了错误“客户端错误:POST'http://127.0.0.1:5111/admin/hotel',导致了'400错误的请求'响应。请提供一个正文中有效的XML对象

2 个答案:

答案 0 :(得分:1)

您无需使用post-data,而是需要使用body

$create = $client->request('POST', 'http://127.0.0.1:5111/admin/hotel', [
    'headers' => [
        'Content-Type' => 'text/xml; charset=UTF8',
    ],
    'body' => $xml                         
]);

$xml将是您要发送到API的XML数据。 Guzzle不会为您创建XML数据,您需要自己做。

可以使用DomDocument class in PHP创建XML数据。

答案 1 :(得分:0)

如果您使用的是 Laravel 7+,这条简单的代码应该可以很好地工作

 $xml = "<?xml version='1.0' encoding='utf-8'?><body></body>";

 Http::withHeaders(["Content-Type" => "text/xml;charset=utf-8"])
                ->post('https://destination.url/api/action', ['body' => $xml]);