• Как сделать curl PUT-запрос к API метрики на изменение счетчика (PHP)?

    @rolecs Автор вопроса
    Верную правку предложил pantsarny, проблема была в опции:
    curl_setopt($curl, CURLOPT_PUT, true);
    Работающая опция:
    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT');
    Работающий код:
    $COUNTER_VAR = '';
    $TOKEN_VAR = '';
    $url = "https://api-metrika.yandex.net/management/v1/counter/$COUNTER_VAR";
    // $data = '{"counter":{"mirrors2":[{"site":"test.example.com"},{"site":"test2.example.com"},{"site":"test3.example.com"},{"site":"test4.example.com"},{"site":"test5.example.com"}]}}'; // так тоже работает
    $data = [
        'counter' => [
            'mirrors2' => [
                ['site' => 'test.example.com'],
                ['site' => 'test2.example.com'],
                ['site' => 'test3.example.com'],
                ['site' => 'test4.example.com'],
                ['site' => 'test5.example.com'],
            ],
        ],
    ];
    $data = json_encode($data);
    $headers = array(
       //"Host: api-metrika.yandex.net", // оказалось необязательно
       "Authorization: OAuth $TOKEN_VAR",
       "Content-Type: application/x-yametrika+json",
       //"Content-Length: " . strlen($data), // оказалось необязательно
    );
    $curl = curl_init($url);
    // curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); // раскомментировать в случае ошибки "HTTP/2 stream 0 was not closed cleanly: PROTOCOL_ERROR (err 1)"
    curl_setopt($curl, CURLOPT_URL, $url);
    // curl_setopt($curl, CURLOPT_PUT, true); // неработающая опция
    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT'); // работающая опция
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    
    //for debug only!
    //curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); // если будет ругаться на сертификат раскомментировать
    //curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // если будет ругаться на сертификат раскомментировать
    
    $resp = curl_exec($curl);
    
    if ($resp === false) {
        echo curl_error($curl);
    } else {
        var_dump($resp);
    }
    
    curl_close($curl);
    Ответ написан
    Комментировать