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 我猜:
- $请求->输入('field_1') -> 'test'
- $请求->输入('field_2') -> 'test'
- $请求->输入('field_3') -> 'test'
- $request->file('file') -> 我上传的文件
另外我要指出,我不确定 multipart/form-data 是如何工作的,所以这可能对我没有帮助。
如果你能给我指出正确的方向,那会很有帮助
嗯,我终于明白了。上面的第二个例子是要走的路也一定要检查请求的 headers 和客户端...
因为这个 API 已经 运行 了很长一段时间并且只做 json 类型的请求,所以客户端被实例化为
$options = [
headers => [ 'Content-Type' => 'application/json']
]
正如互联网上的多个答案所述,它会阻止 Guzzle 根据请求选项自动设置 Content-Type。
在我的例子中,删除此行使 Guzzle 能够在提供 'multipart' 选项时正确设置它。
此外,由于所有其他请求都使用 'json' 选项,因此 Guzzle 也很神奇,设置 'Content-Type' => 'application/json' 也是如此。
我有两个工作项目通过 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 我猜:
- $请求->输入('field_1') -> 'test'
- $请求->输入('field_2') -> 'test'
- $请求->输入('field_3') -> 'test'
- $request->file('file') -> 我上传的文件
另外我要指出,我不确定 multipart/form-data 是如何工作的,所以这可能对我没有帮助。
如果你能给我指出正确的方向,那会很有帮助
嗯,我终于明白了。上面的第二个例子是要走的路也一定要检查请求的 headers 和客户端...
因为这个 API 已经 运行 了很长一段时间并且只做 json 类型的请求,所以客户端被实例化为
$options = [
headers => [ 'Content-Type' => 'application/json']
]
正如互联网上的多个答案所述,它会阻止 Guzzle 根据请求选项自动设置 Content-Type。
在我的例子中,删除此行使 Guzzle 能够在提供 'multipart' 选项时正确设置它。
此外,由于所有其他请求都使用 'json' 选项,因此 Guzzle 也很神奇,设置 'Content-Type' => 'application/json' 也是如此。