【问题标题】:How to make a HTTP POSTrequest to an API using headers如何使用标头向 API 发出 HTTP POST 请求
【发布时间】:2018-07-19 14:16:56
【问题描述】:

我需要将 API 集成到我的应用中。 文档说:

HTTP POST 以下是一个示例 HTTP POST 请求和响应。显示的占位符需要替换为实际值。

POST /partnerhubwebservice.asmx/Authorise HTTP/1.1
Host: stage.example.co.uk
Content-Type: application/x-www-form-urlencoded
Content-Length: length

username=string&password=string

响应是:

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<AuthorisationResult xmlns="http://webservice.example.co.uk/">
  <Token>string</Token>
</AuthorisationResult>

阅读我在 Laravel Controller 中创建此功能的文档:

public function testRld() {

    $client = new GuzzleHttp\Client();
try {
    $res = $client->post('http://stage.example.co.uk/partnerhubwebservice.asmx/Authorise', [
    'headers' => [
        'Content-Type' => 'application/x-www-form-urlencoded',
            ],
    'x-www-form-urlencoded' => [
        'Username' => 'MMM_bookings',
        'Password' => 'passwordaaaa',
]
            ]);

return $res;

}

catch (GuzzleHttp\Exception\ClientException $e) {
        $response = $e->getResponse();
        $result =  json_decode($response->getBody()->getContents());

    return response()->json(['data' => $result]);

    }

}

但我收到了一条消息:

RequestException.php 第 111 行中的 ServerException:服务器错误:POST http://stage.example.co.uk/partnerhubwebservice.asmx/Authorise 导致500 Internal Server Error 响应:缺少参数: 用户名。

当我在 POSTMAN 应用程序上尝试这个时,一切都很好,我得到了响应:

<?xml version="1.0" encoding="utf-8"?>
<AuthorisationResult xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://webservice.example.co.uk/">
    <RequestSuccessful>true</RequestSuccessful>
    <ErrorMessage />
    <Token>27d67d31-999-44e0-9851-d6f427fd2181</Token>
</AuthorisationResult>

请帮我解决这个问题?我的代码有什么问题?为什么我收到错误消息,并且 POSTMAN 请求工作正常...

【问题讨论】:

  • username != Username。首先查看它是否区分大小写。
  • 可能是案例问题?你写的是用户名,而不是用户名
  • 您的用户名和密码以大写字母开头
  • 我尝试了,但这不是问题......我再次收到相同的错误消息
  • 按照the guzzle documentation 所说的方式尝试一下。

标签: php laravel api http-post postman


【解决方案1】:

尝试在正文中将用户名和密码发送为bodyjson,而不是application/x-www-form-urlencoded,如下所示:

$res = $client->post('http://stage.example.co.uk/partnerhubwebservice.asmx/Authorise', [
    'headers' => [
        'Content-Type' => 'application/x-www-form-urlencoded',
    ],
    'json' => [
        'username' => 'MMM_bookings',
        'password' => 'passwordaaaa',
    ]
]);

$res = $client->post('http://stage.example.co.uk/partnerhubwebservice.asmx/Authorise', [
    'headers' => [
        'Content-Type' => 'application/x-www-form-urlencoded',
    ],
    'body' => [
        'username' => 'MMM_bookings',
        'password' => 'passwordaaaa',
    ]
]);

【讨论】:

  • 他们不在headers 部分。
  • 你使用的是什么版本的 guzzle/http?
  • "guzzlehttp/guzzle": "~6.0"
  • 尝试将jsonbody 更改为form_params
  • 当我更改为 form_params 时,我得到:Router.php 第 1227 行中的 FatalErrorException:找不到 Class 'Symfony\Bridge\PsrHttpMessage\Factory\HttpFoundationFactory'
【解决方案2】:

使用form_params:

$client->request('POST', 'http://stage.example.co.uk/partnerhubwebservice.asmx/Authorise', [
    'headers' => [
        'Content-Type' => 'application/x-www-form-urlencoded',
    ],
    'form_params' => [
        'username' => 'MMM_bookings',
        'password' => 'password'
    ]
]);

PSR-7 标准指定了 HTTP 消息的接口,包括请求和响应。如果您想获取 PSR-7 请求的实例而不是 Laravel 请求,您首先需要安装一些库。 Laravel 使用 Symfony HTTP 消息桥组件将典型的 Laravel 请求和响应转换为 PSR-7 兼容的实现:

同时安装必要的依赖项:

composer require symfony/psr-http-message-bridge
composer require zendframework/zend-diactoros

【讨论】:

  • 我收到错误消息:Router.php 第 1227 行中的 FatalErrorException:未找到 Class 'Symfony\Bridge\PsrHttpMessage\Factory\HttpFoundationFactory' ...此外,当我在 POSTMAN 尝试 form_params 时也无法工作...
  • 听起来你缺少依赖项,检查我的答案更新。
  • 好的,谢谢,我会试试的。是否可以在不安装此库的情况下提出请求?
  • guzzle 不需要符合 psr7 的消息。
猜你喜欢
  • 1970-01-01
  • 2021-10-05
  • 1970-01-01
  • 1970-01-01
  • 2019-07-07
  • 1970-01-01
  • 1970-01-01
  • 2017-05-24
  • 2020-11-05
相关资源
最近更新 更多