Post 数据和文件一起到 Laravel API 使用 Guzzle

Post data and file together to Laravel API using Guzzle

我有两个工作项目通过 Laravel 内置的 API 相互通信。到目前为止,只有简单的 POST 使用 GuzzleHttp 6 发出的请求。

我目前正在尝试从 1 到 2 发出一个新的 POST 请求,它将发送几个简单的字段和一个文件。 项目 1 有一个表单,在表单提交上我处理数据并希望通过 POST 请求将它们发送到项目 2 到这个新的 API 端点。

我尝试了不同的 guzzle 选项 'multipart'、'form_data' 等,发现它们可能无法组合在一起。现在我明白这个选项是排他的,只使用 "multipart" 似乎是可行的方法。 但是当我将请求发送到 Laravel 时,那里没有数据和文件。

这是我的请求代码

$options = ‌[
  'multipart' => 
  [
    [
      'name' => 'data',
      'contents' => '{"field_1":"Test","field_2":"Test","field_3":"Test"}',
      'headers' => 
        [
            'Content-Type' => 'application/json',
        ],
    ],
    [
      'name' => 'file',
      'filename' => 'test.pdf',
      'Mime-Type' => 'application/pdf',
      'contents' => file_get_contents($_FILEs['text_file']['temp_name']),
    ]
  ]
];

$this->client->request('POST', "api/test_post", $options)

我也试试这个:

$options = ‌[
  'multipart' => 
  [
    [
      'name' => 'field_1',
      'contents' => 'Test',
    ],
    [
      'name' => 'field_2',
      'contents' => 'Test',
    ],
    [
      'name' => 'file',
      'filename' => 'test.pdf',
      'Mime-Type' => 'application/pdf',
      'contents' => fopen($_FILEs['text_file']['temp_name'],'r'),
    ]
  ]
];

$this->client->request('POST', "api/test_post", $options)

我在接收端看请求内容,什么都没有。没有字段或文件。

我见过情侣 post,有些人说要包括 headers 有些人说不要。我有点迷路了,现在 运行 没主意了。

我希望这些信息就像它们的形式 post 我猜:

另外我要指出,我不确定 multipart/form-data 是如何工作的,所以这可能对我没有帮助。

如果你能给我指出正确的方向,那会很有帮助

嗯,我终于明白了。上面的第二个例子是要走的路也一定要检查请求的 headers 和客户端...

因为这个 API 已经 运行 了很长一段时间并且只做 json 类型的请求,所以客户端被实例化为

$options = [
  headers => [ 'Content-Type' => 'application/json']
]

正如互联网上的多个答案所述,它会阻止 Guzzle 根据请求选项自动设置 Content-Type。

在我的例子中,删除此行使 Guzzle 能够在提供 'multipart' 选项时正确设置它。

此外,由于所有其他请求都使用 'json' 选项,因此 Guzzle 也很神奇,设置 'Content-Type' => 'application/json' 也是如此。