如何向Apify API发送含startUrls数组的HTTP POST请求?
解决PHP中向Apify API发送带嵌套数组请求体的POST请求问题
你已经找对了核心方向,不过代码片段没写完,我来帮你补全完整的可运行代码,同时拆解关键要点:
首先,Apify的这个API要求POST请求体是JSON格式,且startUrls必须是包含键值对的数组——你的$postData结构是对的,但需要把PHP数组转成JSON字符串才能被API正确解析。下面是完整的实现代码:
<?php // 替换为你自己的API参数 $apiUrl = 'https://api.apify.com/v1/USERID/crawlers/CRAWLERID/execute?token=TOKENID'; // 按照API要求构造请求体数据 $postData = [ 'startUrls' => [ ['key' => 'START', 'value' => 'https://instagram.com/instagram'] ] ]; // 将PHP数组编码为JSON字符串(API要求的请求体格式) $jsonPayload = json_encode($postData); // 创建HTTP请求上下文,配置POST请求的细节 $requestContext = stream_context_create([ 'http' => [ 'method' => 'POST', // 必须设置Content-Type告诉服务器接收的是JSON数据 'header' => "Content-Type: application/json\r\n" . "Content-Length: " . strlen($jsonPayload) . "\r\n", 'content' => $jsonPayload // 传入JSON格式的请求体 ] ]); // 发送请求并获取响应 $apiResponse = file_get_contents($apiUrl, false, $requestContext); // 处理请求结果 if ($apiResponse === false) { // 请求失败时捕获错误信息 $lastError = error_get_last(); echo "请求失败:" . $lastError['message']; } else { // 解析API返回的JSON响应 $responseData = json_decode($apiResponse, true); print_r($responseData); } ?>
关键细节说明:
- JSON编码的必要性:Apify API不接受PHP原生数组作为请求体,必须用
json_encode()转换为JSON字符串,这是很多REST API的通用要求。 - 请求头配置:
Content-Type: application/json是核心头信息,没有它服务器会无法正确解析你的请求体;Content-Length则帮助服务器确认接收的数据长度,避免截断。 - 错误处理:添加
file_get_contents()的错误捕获逻辑,能帮你快速排查网络问题、API权限问题等。
额外小贴士:
- 如果需要添加多个起始URL,只需在
startUrls数组中追加新的键值对即可:'startUrls' => [ ['key' => 'START', 'value' => 'https://instagram.com/instagram'], ['key' => 'START', 'value' => 'https://instagram.com/apify'] ] - 若遇到SSL证书验证错误(测试环境常见),可以在上下文里临时添加SSL配置(生产环境不建议禁用验证):
'ssl' => [ 'verify_peer' => false, 'verify_peer_name' => false ]
内容的提问来源于stack exchange,提问作者Jack Ellis
相关产品推荐
相关产品推荐

