Преобразование wp_remote_post () в cURL - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть этот код WordPress, использующий wp_remote_post() для вызова API в LinkedIn.

    $args = array(
                'headers' => array('Content-Type' => 'text/xml'),
                'body' => "<?xml version='1.0' encoding='UTF-8' standalone='yes'?><company><id>{$nCompanyID}</id></company>"
            ); 
    $access_token = $datapass->access_token_get();                    
    $params = array('oauth2_access_token' => $access_token); 
    $resource = "https://api.linkedin.com/v1/people/~/following/companies?" . http_build_query($params);        
    $response = wp_remote_post( $resource, $args); 
    $code = $response['response']['code'];
    $body = wp_remote_retrieve_body($response);
    $RV = ($code == '201');
    return $RV;  

Это работает. Теперь мне нужно преобразовать его в php cURL. Я пробовал различные примеры размещения php cURL XML, которые я нашел в Интернете, но не повезло. Вот последняя попытка.

$access_token = "long_string_of_characters";
$nCompanyID = 2495437;
$xml = "<?xml version='1.0' encoding='UTF-8' standalone='yes'?><company><id>{$nCompanyID}</id></company>";
$url = 'https://api.linkedin.com/v1/people/~/following/companies?oauth2_access_token='.$access_token;

$headers = array(
    "Content-type: text/xml",
    "Content-length: " . strlen($xml)
);

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('body' => $xml));
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$data = curl_exec($ch); 

$data возвращается с ошибкой 400 и сообщением «Неожиданный элемент: CDATA». Если я удаляю массив из CURLOPT_POSTFIELDS и использую только $xml, $ data возвращается как пустая строка.

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 08 ноября 2018

Если сервер ожидает XML POST, то передача массива в CURLOPT_POSTFIELDS не сделает его счастливым.

Запишите в исходном коде метод построения URL:

$params = array('oauth2_access_token' => $access_token); 
$resource = "https://api.linkedin.com/v1/people/~/following/companies?" . http_build_query($params);        

Вы захотите сохранить это. http_build_query() выполняет экранирование, необходимое, если ваш токен доступа содержит специальные символы.

У меня возникнут вопросы, является ли ваш токен доступа действительным, учитывая, что исходный код, кажется, динамически генерирует его с $datapass->access_token_get();

В противном случае похоже, что у вас все установлено одинаково.

<?php
$access_token = "long_string_of_characters";
$nCompanyID   = 2495437;
$xml          = "<?xml version='1.0' encoding='UTF-8' standalone='yes'?><company><id>$nCompanyID</id></company>";
$params       = ["oauth2_access_token" => $access_token]; 
$url          = "https://api.linkedin.com/v1/people/~/following/companies?";
$url         .= http_build_query($params);

$headers = [
    "Content-type: text/xml",
    "Content-length: " . strlen($xml)
];

$ch = curl_init(); 
curl_setopt_array($ch, [
    CURLOPT_URL            => $url,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => $xml,
    CURLOPT_HTTPHEADER     => $headers,
]);
$data = curl_exec($ch); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...