1
votes

I am trying to post a request to my Web API, using Laravel Guzzle Http client. However, I am getting errors trying to post the request. The data I want to send is XML as the API controller is built in XML return format.

I have tried all sorts of methods to post the request with Guzzle but it is yet to work.

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();
}

I expected the result to POST to the web service and save data to database, but however I got the error "Client error: POST 'http://127.0.0.1:5111/admin/hotel' resulted in a '400 bad request' response. Please provide a valid XML object in the body

2

2 Answers

5
votes

Rather than using post-data in the guzzle request, you need to use body:

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

$xml will be the XML data you want to send to the API. Guzzle will not create the XML data for you, you'll need to do this yourself.

The XML data can be created using the DomDocument class in PHP.

0
votes

If you are using Laravel 7+ this simple line should work very well

 $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]);