如何使用Guzzle将API请求发送到仅支持XML格式的Restful?

时间:2019-03-28 15:24:07

标签: php xml laravel api guzzle

我在Laravel 5.8项目中使用Guzzle已有一段时间了。它已经与支持JSON格式的Restful API一起使用。

现在有一个新的Restful API,仅支持XML格式。我不知道如何使用Guzzle来做到这一点。以下是HTTP请求的外观示例。

POST: http://api.url_endpoint.com/my_api.ashx HTTP/1.1
Content-Type: application/x-www-form-url encoded
Host: http://api.url_endpoint.com
Content-Length: 467
Expect: 100-continue
Connection: Close

<Section>
    <LoginDetails>
        <Login>ABC</Login>
        <Password>ABCDE</Password>
    </LoginDetails>
</Section>

在文档中说:The XML should be in the body of the request.

问题1.如何将XML放入请求的正文中?

问题2。请注意HTTP/1.1,是否应将其串联为API URL端点的后缀?

这就是我尝试过的方式。

$header_options = [
    'headers' => [
            'Accept' => 'application/xml',
            'Content-Type' => 'application/x-www-form-url encoded',
            'Host' => 'http://api.url_endpoint.com',
            'Content-Length' => 467,
            'Expect' => '100-continue',
            'Connection' => 'Close',
    ],
    'body' => '<Section><LoginDetails><Login>ABC</Login><Password>ABCDE</Password></LoginDetails></Section>',
];

$response = $client->request('POST', 'http://api.url_endpoint.com/my_api.ashx', $header_options);

dump($response->xml());

但是我仍然收到400错误请求作为答复。

1 个答案:

答案 0 :(得分:0)

首先,仅尝试修复Content-Type标头值:public function quickList(Request $request) { $user = User::firstOrCreate([ 'name' => $request->owner_of_the_room, 'email' => $request->owner_working_email, 'password' => bcrypt($request->password), 'role_id' => config('quickadmin.default_role_id'), ]); \Auth::loginUsingId($user->id); if (\Auth::check()){ $city = new TotalCity; $city->name = $request->location_id; $city->created_by_id = \Auth::user()->id; $city->save(); return redirect()->to('/admin/home'); }else{ return redirect()->back(); } } (而不是application/x-www-form-urlencoded)。

如果这不起作用,还尝试解析这样的主体:

application/x-www-form urlencoded

如果这不起作用,可以尝试以这种方式更改标头集:

$header_options = [
    'headers' => [
            ...
            'Content-Type' => 'application/x-www-form-urlencoded'
            ...
    ],
    ...
    'body' => urlencode('<Section><LoginDetails><Login>ABC</Login><Password>ABCDE</Password></LoginDetails></Section>'),
];

让我知道这些想法之一是否对您有所帮助:)