Ошибка при использовании curl

94
15 марта 2021, 20:30

Я новичок в php, поэтому не судите строго.

Имеется функция createOrEditUser(); Помимо нее есть функции, которые построены по тому же запросу, но не POST, а GET. Функции вызываю из другого файла с помощью echo; Все работает, выводит как надо. Но когда в этой функции делаю POST запрос, то происходит ошибка. Все ключи для использования API правильные, все работает нормально(на основе рабочей ф-ции написал). Ошибку даже не выводит, просто мой файл test.php с echo перестает даже выдавать результат выполнения других функций и просто белый экран.

Вот код:

public function createOrEditUser()
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, self::url.'customers/create_or_update?access_token='.self::GetToken()'&organization='.self::GetOrgList());
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, '{"customer":{"phone":"+79274728106","name":"Тест"}}');
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json; charset=utf-8'));
    $out = curl_exec($ch);
    curl_close($ch);
    return $out;
}

URL правильный. JSON валидный.

Answer 1

В случае ошибки curl_exec вернёт false. Узнать что пошло не так, поможет curl_error. Кроме того, тело ответа может быть пустым (это же POST запрос).

Вообще лучше один раз написать универсальную функцию запроса (или использовать готовую)

function request($method, $url, array $headers, $body = '', $opts = []) {
    $curl = curl_init($url);
    curl_setopt_array($curl, $opts + [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HEADER => true,
        CURLOPT_CUSTOMREQUEST => $method,
        CURLOPT_HTTPHEADER => $headers,
        CURLOPT_POSTFIELDS  => $body,
    ]);
    $result = curl_exec($curl);
    if ($result === false) {
        $error = curl_error($curl);
        curl_close($curl);
        throw new \Exception($error);
    }
    $headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
    $responseHeaders = substr($result, 0, $headerSize);
    $headers = array_filter(explode("\r\n", $responseHeaders));
    $responseBody = substr($result, $headerSize);
    $code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    $response = [
        0 => $code,
        'code' => $code,
        1 => $headers,
        'headers' => $headers,
        2 => $responseBody,
        'body' => $responseBody,
    ];
    curl_close($curl);
    return $response;
}
try {
    list($code, $headers, $body)= request(
        'POST',
        self::url . 'customers/create_or_update?access_token=' . self::GetToken() . '&organization=' . self::GetOrgList(),
        ['Content-Type: application/json; charset=utf-8'],
        '{"customer":{"phone":"+79274728106","name":"Тест"}}'
    );
} catch (\Exception $e) {
    echo 'FAIL: ' . $e->getMessage();
}
if ($code === 200) {
    echo 'OK';
} else {
    echo 'FAIL: ' . $code;
}
READ ALSO
как залить пост на wordpress с помощью curl bash

как залить пост на wordpress с помощью curl bash

есть функция стандартная wp_insert_post() как можно вставить пост с помощью этой функции через bash

70
Java Json выгрузка разных полей

Java Json выгрузка разных полей

Есть объект с несколькими полями который отправляется как Json запрос на сервер

111
можно ли проверить тип параметра generic

можно ли проверить тип параметра generic

Можно ли проверить непосредственно тип самого параметра в классе generic? типа этого?

111