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.
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 4

昨天也发现这个问题了

8年前 评论
mouyong

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

8年前 评论

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

    /** @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());
    }
8年前 评论
mouyong

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

8年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!