将HTTP Post请求发送到Body中包含数组的站点

时间:2018-04-06 19:47:20

标签: php apify

我尝试发出POST请求并在API调用的主体中发送一些值。在documentation of the API中,我说我需要发出一个POST请求,将startUrls用作keyvalue的数组。

<?php
$url = 'https://api.apify.com/v1/USERID/crawlers/CRAWLERID/execute?token=TOKENID';

$postData = array(
'startUrls' => array(array('key'=>'START', 'value'=>'https://instagram.com/instagram'))
);
$context = stream_context_create(array(
    'http' => array(
        'method' => 'POST',
        'header' => 'Content-type: application/json',
        'body' => json_encode($postData)
        )
));
$resp = file_get_contents($url, FALSE, $context);
print_r($resp); 
?>

JSON似乎应该如何,但脚本没有正确地将正文发送到网站。

2 个答案:

答案 0 :(得分:2)

根据the documentation,HTTP上下文没有body选项。请尝试content

<?php
$url = "https://api.apify.com/v1/USERID/crawlers/CRAWLERID/execute?token=TOKENID";

$postData = [
    "startUrls" => [
        ["key"=>"START", "value" => "https://instagram.com/instagram"]
    ]
];

$context = stream_context_create([
    "http" => [
        "method"  => "POST",
        "header"  => "Content-type: application/json",
        "content" => json_encode($postData)
    ]
]);
$resp = file_get_contents($url, FALSE, $context);
print_r($resp);

答案 1 :(得分:1)

以下代码可以使用。我已设置标头并指定了内容类型。

$request = new HttpRequest();
$request->setUrl('$url = 'https://api.apify.com/v1/USERID/crawlers/CRAWLERID/execute?token=TOKENID');
$request->setMethod(HTTP_METH_POST);

$request->setHeaders(array(
  'cache-control' => 'no-cache',
  'content-type' => 'application/x-www-form-urlencoded'
));

$request->setContentType('application/x-www-form-urlencoded');
$request->setPostFields(array('key'=>'START', 'value'=>'https://instagram.com/instagram')
));

try {
  $response = $request->send();

  echo $response->getBody();
} catch (HttpException $ex) {
  echo $ex;
}

如果您想尝试使用cUrl,以下代码段将起作用。

$curl = curl_init();
$postData = array(
'startUrls' => array(array('key'=>'START', 'value'=>'https://instagram.com/instagram'))
);

        curl_setopt_array($curl, array(
            CURLOPT_URL => "https://api.apify.com/v1/USERID/crawlers/CRAWLERID/execute?token=TOKENID",
            CURLOPT_RETURNTRANSFER => true,
                CURLOPT_ENCODING => "",
                CURLOPT_MAXREDIRS => 10,
                CURLOPT_TIMEOUT => 30,
                CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                CURLOPT_CUSTOMREQUEST => "POST",
                CURLOPT_POSTFIELDS => $postData,
                CURLOPT_HTTPHEADER => array(
                    "Cache-Control: no-cache",
                    "content-type: multipart/form-data;"
                ),
            ));

        $response = curl_exec($curl);
        $err = curl_error($curl);
        curl_close($curl);