gpt4 book ai didi

php - 使用 wp_remote_post() 将带有图像的多部分表单数据发布到 iNaturalist REST API

转载 作者:搜寻专家 更新时间:2023-10-31 21:21:43 30 4
gpt4 key购买 nike

我正在开发一个 WordPress 网站,允许用户提交观察结果,然后将这些观察结果推送到 iNaturalist API。我已经成功验证,推送了观察数据,并从 API 收到了观察的 ID。我完全无法使用 POST /observation_photos 推送照片端点。我怀疑我没有正确格式化有效负载,但我找不到任何我熟悉的语言的此类请求的工作示例,因此有很多盲目刺伤。

在发帖之前我已经尝试了很多东西,所以请耐心等待我检查它们以及每一个的结果。

首先,我尝试了以下方法:

$photo_payload = [
'method' => 'POST',
'timeout' => 10,
'headers' => [
'Authorization' => "Bearer $auth",
'Content-Type' => "multipart/form-data;"
],
'body' => [
'observation_photo' => [
'observation_id' => $inat_id
],
'file' =>file_get_contents($photo_sized)
]
];
$post_photo = wp_remote_post($inat_base_url . '/observation_photos', $photo_payload);

结果是:500 Internal Server Error

然后我尝试从 body 数组中删除文件并发送:

$photo_payload = [
'method' => 'POST',
'timeout' => 10,
'headers' => [
'Authorization' => "Bearer $auth",
'Content-Type' => "multipart/form-data;"
],
'body' => [
'observation_photo' => [
'observation_id' => $inat_id
],
'file' => ''
]
];

我们取得了成功,iNaturalist 在观察中添加了占位符“正在处理...”图像(如此处所示:https://www.inaturalist.org/observations/8014211)。

所以这告诉我文件数据没有正确发送。我尝试对图像数据进行 base64_encoding,但也出现了 500 错误。

接下来是这个尝试:

$photo_payload = [
'method' => 'POST',
'timeout' => 10,
'headers' => [
'Authorization' => "Bearer $auth",
'Content-Type' => "multipart/form-data;"
],
'body' => [
'observation_photo' => [
'observation_id' => $inat_id
],
'file' => '@' . $photo_sized . ';filename=' . basename($photo_sized) . ';type=' . get_post_mime_type($photo_id)
]
];

这给了我另一个 500 Internal Server Error

然后我开始研究 multipart/form-data 兔子洞并基于这篇文章 ( http://codechutney.com/posting-file-using-wp_remote_post/ ) 尝试:

$boundary = wp_generate_password( 24 );

$body = '';
$body .= '--' . $boundary . "\r\n";
$body .= 'Content-Disposition: form-data; name="file"; filename="' . basename($photo_sized) . "\"\r\n";
$body .= 'Content-Type: ' . $photo_type . "\r\n\r\n";
$body .= base64_encode(file_get_contents($photo_sized)) . "\r\n";
$body .= '--' . $boundary . "\r\n";
$body .= 'Content-Disposition: form-data; name="observation_photo"' . "\r\n";
$body .= 'Content-Type: application/json' . "\r\n\r\n";
$body .= json_encode(['observation_id' => $inat_id]) . "\r\n";
$body .= '--' . $boundary . '--' . "\r\n";

$photo_payload = [
'method' => 'POST',
'timeout' => 10,
'headers' => [
'Authorization' => "Bearer $auth",
'Content-Type' => "multipart/form-data; boundary=$boundary"
],
'body' => $body
];

唉,又是一个 500 Internal Server Error

说真的,我一直在用头撞墙,以至于我不记得我尝试过的所有事情。在某些时候,我知道我也遇到了超时错误,但我现在无法重新创建它们。

其他注意事项:如果我将端点从 observation_photos 更改为 observation_photos.json,它似乎没有任何改变。我要发送的文件是 7585 字节。

最佳答案

收到 iNaturalist 开发人员的回复!他们让我知道多部分请求的正确格式如下:

[body] => --abc
Content-Disposition: form-data; name="file"; filename="20170816_071116-150x150.jpg"
Content-Type: image/jpeg

[raw image data]
--abc
Content-Disposition: form-data; name="observation_photo[observation_id]"

8014211
--abc--

所以我将有效负载的主体更改为以下内容并且它有效!

$body = '';
$body .= '--' . $boundary . "\r\n";
$body .= 'Content-Disposition: form-data; name="file"; filename="' . basename($photo_sized) . "\"\r\n";
$body .= 'Content-Type: ' . $photo_type . "\r\n\r\n";
$body .= base64_encode(file_get_contents($photo_sized)) . "\r\n";
$body .= '--' . $boundary . "\r\n";
$body .= 'Content-Disposition: form-data; name="observation_photo[observation_id]"' . "\r\n";
$body .= 'Content-Type: application/json' . "\r\n\r\n";
$body .= $inat_id . "\r\n";
$body .= '--' . $boundary . '--' . "\r\n";

这是 GitHub 问题解决方案的链接: https://github.com/inaturalist/inaturalist/issues/1483#issuecomment-331239325

关于php - 使用 wp_remote_post() 将带有图像的多部分表单数据发布到 iNaturalist REST API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46345259/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com