【问题标题】:Guzzle post nested array IssueGuzzle 发布嵌套数组问题
【发布时间】:2019-02-23 22:41:00
【问题描述】:

我使用 Laravel 5.5 和 Guzzle 6.3 开发网站。

在尝试使用 API 创建文件夹到 BOX 时,我遇到了一个问题。

$url = $this->api_url . "/folders";
$headers = [
    'Authorization' => 'Bearer ' . $this->access_token,        
];
$client = new Client();
$response = $client->post($url, [
    'headers' => $headers, 
    'form_params' => [
        'name' => $name,
        'parent' => [
            'id' => $parent_id
        ]
    ]
]);

它向我显示这样的错误:

实体主体应该是正确嵌套的资源属性名称/值对

我也已经尝试过使用shell_exec curl 所以它从命令提示符运行 curl 并且它给了我同样的错误

但是当我尝试从 cygwin 运行时,curl 工作正常。

我也可以使用多部分请求嵌套数组进行上传。

当嵌套数组适用于多部分请求时,我不知道为什么会遇到这个嵌套数组问题。

Box 文档参考 POST is here

【问题讨论】:

    标签: laravel curl xdebug guzzle


    【解决方案1】:

    供您对包含嵌套字段的数据进行任何http请求;您必须在标题中包含Content-Type;然后将其设置为application/x-www-form-urlencoded,如下所示:

    $url = $this->api_url . "/folders";
    $headers = [
        'Accept'       => 'application/json',
        'Content-Type' => 'application/x-www-form-urlencoded',
        'Authorization' => 'Bearer ' . $this->access_token,
    ];
    $client = new Client();
    $response = $client->post($url, [
        'headers' => $headers,
        'form_params' => [
            'name' => $name,
            'parent' => [
                'id' => $parent_id
            ]
        ]
    ]);
    

    【讨论】:

      【解决方案2】:

      根据docs,您不能使用多部分选项:

      form_params 不能与 multipart 选项一起使用。您将需要使用其中一个。对 application/x-www-form-urlencoded 请求使用 form_params,对 multipart/form-data 请求使用 multipart。

      此选项不能与 body、multipart 或 json 一起使用

      所以也许在创建客户端实例时尝试设置标头:

      $url = $this->api_url . "/folders";
      
      $client = new Client([
          'headers' => [
              'Authorization' => 'Bearer ' . $this->access_token,
              'Accept'        => 'application/json',        
          ]
      ]);
      
      $response = $client->post($url, [ 
          'json' => [
              'name' => $name,
              'parent' => [
                  'id' => $parent_id
              ]
          ]
      ]);
      

      实际上再次阅读框参考后,没有文件上传的发布请求接受 application/json , 这是用于 application/x-www-form-urlencoded 的 form_params

      【讨论】:

      • 是的,我明白 form_params 不能与 multipart 选项一起使用,我已经尝试过你提到的,它仍然给了我同样的错误developer.box.com/v2.0/reference#create-a-new-folder 我知道它不需要 multipart 我只提到,我的代码/my curl 用于上传它也有嵌套数组,它工作得很好
      • 好的,我根据你的建议解决了,我会编辑你的建议
      • 那么问题可能是您正在为父级传递一个关联数组。 this answer 可能会帮助你
      • 是的,您的第一个建议实际上是正确的,移出标题​​以调用 guzzle,然后添加应用程序 json 并将 form_params 更改为 json 感谢 Daniel 的帮助!
      猜你喜欢
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      • 2013-02-16
      • 2019-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多