За последние 24 часа нас посетил 6701 программист и 651 робот. Сейчас ищут 92 программиста ...

soap работает, а curl нет

Тема в разделе "PHP для новичков", создана пользователем shtrih, 13 дек 2019.

  1. shtrih

    shtrih Активный пользователь

    С нами с:
    10 дек 2015
    Сообщения:
    52
    Симпатии:
    3
    Добрый день!
    Мне потребовалось работать с API Adwords.
    В SOAPUI я запрос делаю и приходит нормальный ответ в XML

    Запрос:
    Код (Text):
    1. POST https://adwords.google.com/api/adwords/reportdownload/v201809 HTTP/1.1
    2. Accept-Encoding: gzip,deflate
    3. Host: adwords.google.com
    4. User-Agent: curl, gzip
    5. Accept: /
    6. Accept-Encoding: gzip
    7. Authorization: Bearer ya29.Il4354535
    8. developerToken: NBs222222222222
    9. clientCustomerId: 467-008-0000
    10. Expect: 100-continue
    11. Content-Type: application/x-www-form-urlencoded
    12. Content-Length: 240
    13. Connection: Keep-Alive
    Ответ
    Код (Text):
    1. <reportDownloadError>
    2.    <ApiError>
    3.       <type>AuthenticationError.OAUTH_TOKEN_INVALID</type>
    4.       <trigger>&lt;null></trigger>
    5.       <fieldPath/>
    6.    </ApiError>
    7. </reportDownloadError>
    Если пытаюсь реализовать, тоже самое с curl, то приходит


    Код (Text):
    1. �m�� �@�_E��-�[�"h$�vЮ���¶+�o��'"ԡ���034y?��7(kb���s�B��>l�����5� �0꠷3�2�r�;g�i�V©��؁Au�8�/NP�M}l�ꔗmQ^�s��pIStJJp���Qk_b4{�J� ��p� �;�;��&���
    2. �m�� �@�_E��-�[�"h$�vЮ���¶+�o��'"ԡ���034y?��7(kb���s�B��>l�����5� �0꠷3�2�r�;g�i�V©��؁Au�8�/NP�M}l�ꔗmQ^�s��pIStJJp���Qk_b4{�J� ��p� �;�;��&���

    Сам код

    Код (Text):
    1. <?php
    2.  
    3. echo("
    4. <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'>
    5. <html>
    6. <head>
    7.  
    8.  
    9.     <title>Adwords </title>
    10.     <link rel='stylesheet' type='text/css' href='../style.css'>
    11.  
    12.     <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>");
    13.  
    14.  
    15. $url = 'https://adwords.google.com/api/adwords/reportdownload/v201809';
    16. $headers = array(
    17.     "Host: adwords.google.com",
    18.     "User-Agent: curl, gzip",
    19.     "Accept:  /",
    20.     "Accept-Encoding: gzip",
    21.     "Authorization: Bearer ya29.Il4354535",
    22.     "developerToken:NBs222222222222",
    23.     "clientCustomerId:467-008-0000",
    24.     "Expect: 100-continue",
    25.     "Content-Length: 240",
    26.     "Connection: Keep-Alive"
    27.  
    28.  
    29. );
    30. $body = '__fmt=CSV&__rdquery=SELECT%20Date%2C%20CampaignId%2C%20AdGroupId%2C%20AdGroupName%2C%20Impressions%2C%20Clicks%2C%20Cost%20%20%20FROM%20ADGROUP_PERFORMANCE_REPORT%20%20%20WHERE%20AdGroupStatus%20IN%20%5BENABLED%2C%20PAUSED%5D%20DURING%20LAST_7_DAYS';
    31.  
    32. echo "<br>Отчет Adwords<br>";
    33. $cookiePath = tempnam('/tmp', 'cookie');
    34. //var_dump($body);
    35. // Инициализация cURL
    36. $curl = curl_init();
    37. curl_setopt($curl, CURLOPT_URL, $url);
    38. curl_setopt($curl, CURLOPT_POST, 1);
    39. curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
    40. curl_setopt($curl, CURLOPT_COOKIEJAR, $cookiePath);
    41.  
    42. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    43.  
    44. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    45. curl_setopt($curl, CURLOPT_HEADER, true);
    46. curl_setopt($curl, CURLINFO_HEADER_OUT, true);
    47. curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    48.  
    49. // --- Запуск цикла для выполнения запросов ---
    50. // Если получен HTTP-код 200, то выводится содержание отчета
    51. // Если получен HTTP-код 201 или 202, выполняются повторные запросы
    52. while (true) {
    53.  
    54.     $result = curl_exec($curl);
    55.  
    56.     $info = curl_getinfo($curl);
    57.  
    58.     if (!$result) {
    59.  
    60.         echo('Ошибка cURL: ' . curl_errno($curl) . ' - ' . curl_error($curl));
    61.  
    62.         break;
    63.  
    64.     } else {
    65.  
    66.         echo "<br><br>";
    67.         // Разделение HTTP-заголовков и тела ответа
    68.         $responseHeadersSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
    69.         //   var_dump($responseHeadersSize) ;
    70.         echo "<br><br>";
    71.         $responseHeaders = substr($result, 0, $responseHeadersSize);
    72.         $responseBody = substr($result, $responseHeadersSize);
    73.  
    74.         // Получение кода состояния HTTP
    75.         $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    76.  
    77.         // Извлечение HTTP-заголовков ответа
    78.         // Идентификатор запроса
    79.         $requestId = preg_match('/RequestId: (\d+)/', $responseHeaders, $arr) ? $arr[1] : false;
    80.         //  Рекомендуемый интервал в секундах для проверки готовности отчета
    81.         $retryIn = preg_match('/retryIn: (\d+)/', $responseHeaders, $arr) ? $arr[1] : 60;
    82.  
    83.         if ($httpCode == 400) {
    84.  
    85.             echo "Параметры запроса указаны неверно или достигнут лимит отчетов в очереди<br>";
    86.             echo "RequestId: {$requestId}<br>";
    87.             echo "JSON-код запроса:<br>{$body}<br>";
    88.             echo "JSON-код ответа сервера:<br>{$responseBody}<br>";
    89.  
    90.             break;
    91.  
    92.         } elseif ($httpCode == 200) {
    93.  
    94.             echo "Отчет создан успешно<br>";
    95.             echo "RequestId: {$requestId}<br>";
    96.             echo $responseBody;
    97.  
    98.             break;
    99.  
    100.         } elseif ($httpCode == 201) {
    101.  
    102.             echo "Отчет успешно поставлен в очередь в режиме офлайн<br>";
    103.             echo "Повторная отправка запроса через {$retryIn} секунд<br>";
    104.             echo "RequestId: {$requestId}<br>";
    105.  
    106.             sleep($retryIn);
    107.  
    108.         } elseif ($httpCode == 202) {
    109.  
    110.             echo "Отчет формируется в режиме offline.<br>";
    111.             echo "Повторная отправка запроса через {$retryIn} секунд<br>";
    112.             echo "RequestId: {$requestId}<br>";
    113.  
    114.             sleep($retryIn);
    115.  
    116.         } elseif ($httpCode == 500) {
    117.  
    118.             echo "При формировании отчета произошла ошибка. Пожалуйста, попробуйте повторить запрос позднее<br>";
    119.             echo "RequestId: {$requestId}<br>";
    120.             echo "JSON-код ответа сервера:<br>{$responseBody}<br>";
    121.  
    122.             break;
    123.  
    124.         } elseif ($httpCode == 502) {
    125.  
    126.             echo "Время формирования отчета превысило серверное ограничение.<br>";
    127.             echo "Пожалуйста, попробуйте изменить параметры запроса - уменьшить период и количество запрашиваемых данных.<br>";
    128.             echo "RequestId: {$requestId}<br>";
    129.  
    130.             break;
    131.  
    132.         } else {
    133.  
    134.             echo "Произошла непредвиденная ошибка.<br>";
    135.             echo "RequestId: {$requestId}<br>";
    136.             // echo "JSON-код запроса:<br>{$body}<br>";
    137.             echo "ответа сервера:<br>{$responseBody}<br>";
    138.  
    139.             break;
    140.  
    141.         }
    142.     }
    143. }
    144.  
    145. curl_close($curl);
    146.  
    147. echo $responseBody;
    148.  
    149.  
    150. ?>
     
  2. shtrih

    shtrih Активный пользователь

    С нами с:
    10 дек 2015
    Сообщения:
    52
    Симпатии:
    3
    Проблему решил. Надо убрать строчку "Accept-Encoding: gzip",
     
    Roman __construct нравится это.