Zttp 发送 form params 请求 而非 JSON 请求

前段时间,@JokerLinly 琳姐 发表的一文章 Zttp ——简化你的 Guzzle 调用,让我开始使用 「Zttp」 替代 「Guzzle」作为我的 http 请求客户端。

最近在对接百度外卖的 3.0 接口的时候,发送的请求总是获取不到需要的数据。总是获取到 ‘unsupport api version’ 或 'sign not match',百度外卖开放平台中有人也遇到过同样的 问题,官方给出的答案是:

3.0是POST格式,并不是大的JSON串。

调试后才知道 「Zttp」发送的请求默认是 json,

array:4 [
  "http_errors" => false
  "query" => []
  "json" => array:9 [
    "body" => "{"order_id":"14969211155953"}"
    "cmd" => "order.confirm"
    "encrypt" => ""
    "secret" => "404d601cab72fbd6"
    "source" => "64824"
    "ticket" => "AC555E53-C016-E4D6-BFE6-8FEF0EE873C5"
    "timestamp" => 1496985951
    "version" => 3
    "sign" => "7652BDE9F8D5AF01807DA7330BBD31F3"
  ]
  "synchronous" => true
]

解决办法是在 post 请求之前调用 asFormParams() 方法。
Zttp::asFormParams()->post(bd_api_url(), $params);

array:5 [
  "http_errors" => false
  "headers" => array:1 [
    "Content-Type" => "application/x-www-form-urlencoded"
  ]
  "query" => []
  "form_params" => array:9 [
    "body" => "{"order_id":"14969211155953"}"
    "cmd" => "order.confirm"
    "encrypt" => ""
    "secret" => "404d601cab72fbd6"
    "source" => "64824"
    "ticket" => "AC555E53-C016-E4D6-BFE6-8FEF0EE873C5"
    "timestamp" => 1496985890
    "version" => 3
    "sign" => "4EB8BA18D822D3BBDD125FFCF124E7B0"
  ]
  "synchronous" => true
]
本作品采用《CC 协议》,转载必须注明作者和本文链接
Study hard and make progress every day. Study hard and make progress every day.
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 4

昨天也发现这个问题了

7年前 评论
mouyong

@dinghua :+1: 我也是昨天发现的,然后找了半天,最后看到个 form_parms ,果断去看了下源码里,然后测试了下,就解决了。

7年前 评论

我在他的测试文件里看的,我基本把测试文件当文档看:

    /** @test */
    function post_content_can_be_sent_as_form_params()
    {
        $response = Zttp::asFormParams()->post($this->url('/post'), [
            'foo' => 'bar',
            'baz' => 'qux',
        ]);
        $this->assertArraySubset([
            'headers' => [
                'content-type' => ['application/x-www-form-urlencoded'],
            ],
            'form_params' => [
                'foo' => 'bar',
                'baz' => 'qux',
            ]
        ], $response->json());
    }
7年前 评论
mouyong

@dinghua 看样子下次我得仔细点看了:joy:

7年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
打杂的 @ 某某医学
文章
35
粉丝
63
喜欢
328
收藏
112
排名:37
访问:19.1 万
私信
所有博文
社区赞助商