Загрузка изображений не работает в Linkedin V2 API - PullRequest
1 голос
/ 10 апреля 2019

Я сейчас работаю с интеграцией Linkedin V2 с моим приложением. У меня возникла проблема при попытке загрузить изображение в Linkedin.

Я попытался запрос CURL со своего терминала (я использую Ubuntu OS) и получил ответ, как показано ниже:

Терминальная команда (рабочая и файл загружен):

curl -i --upload-file /Users/peter/Desktop/superneatimage.png --header "Authorization: Bearer redacted" 'https://api.linkedin.com/mediaUpload/C5522AQGTYER3k3ByHQ/feedshare-uploadedImage/0?ca=vector_feedshare&cn=uploads&m=AQJbrN86Zm265gAAAWemyz2pxPSgONtBiZdchrgG872QltnfYjnMdb2j3A&app=1953784&sync=0&v=beta&ut=2H-IhpbfXrRow1'

Это ответ, как показано ниже:

HTTP / 2 201 дата: среда, 10 апреля 09:14:44 UTC 2019 сервер: Play set-cookie: lang = v = 2 & lang = en-us; Path = /; Домен = api.linkedin.com x-ambry-creation-time: ср 10 апреля 09:14:44 UTC 2019 access-control-allow-origin: https://www.linkedin.com длина содержимого: 0

У меня возникает проблема при интеграции запроса CURL в мое приложение. Мой код запроса CURL из моей заявки приведен ниже.

$headers = array();
$headers[] = 'Authorization: Bearer xxxxx';
$headers[] = 'X-Restli-Protocol-Version: 2.0.0';
$headers[] = 'Content-Type: multipart/form-data';
$ch = curl_init();
$options = array(
    CURLOPT_HEADER => true,
    CURLOPT_CUSTOMREQUEST => 'PUT',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_URL => 'https://api.linkedin.com/mediaUpload/C5522AQGTYER3k3ByHQ/feedshare-uploadedImage/0?ca=vector_feedshare&cn=uploads&m=AQJbrN86Zm265gAAAWemyz2pxPSgONtBiZdchrgG872QltnfYjnMdb2j3A&app=1953784&sync=0&v=beta&ut=2H-IhpbfXrRow1',
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => array("upload-file" => '/Users/peter/Desktop/superneatimage.png')
    // CURLOPT_POSTFIELDS => array("upload-file" => new CURLFile('/Users/peter/Desktop/superneatimage.png'))
);
curl_setopt_array($ch, $options);
$response = curl_exec($ch);
print_r($response);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

Ответ как:

HTTP / 1.1 400 Bad Request Сервер: Play Set-Cookie: lang = v = 2 & lang = en-us; Path = /; Домен = api.linkedin.com Дата: среда, 10 апреля 2019 09:16:25 GMT Длина содержимого: 0 X-Li-Fabric: prod-lsg1 Подключение: keep-alive

Ссылка на документ Linkedin

Аналогичный вопрос от SO , который не решил мою проблему.

1 Ответ

3 голосов
/ 11 апреля 2019

Используйте клиент Guzzle HTTP вместо curl. Я пробовал curl, но он не работает.

Сначала установите composer в текущем каталоге с помощью следующей команды:

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '48e3236262b34d30969dca3c37281b3b4bbe3221bda826ac6a9a62d6444cdb0dcd0615698a5cbe587c3f0fe57a54d8f5') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

После обновления композитора запустите следующую команду, чтобы установить Guzzle (по умолчанию будет 3.9, требуется php> = 5.3.3. Вы можете указать, основываясь на вашей версии php):

php composer.phar требуют guzzlehttp / guzzle

После успешной установки клиента Guzzle. Пожалуйста, используйте приведенный ниже код для загрузки файла

    require 'vendor/autoload.php';
    $client =new \GuzzleHttp\Client();
    $image_path='/path_to_your_image/my_image.png';
    $result=$client->request('PUT',$target_url, [
             'headers' => [
                 'Authorization' => 'Bearer ' . $token
              ],
              'body' => fopen($image_path, 'r'),

        ]);

Вы получите полный успех ниже ответа

HTTP / 2 201

дата: ср 10 апреля 09:14:44 UTC 2019 сервер: Play set-cookie: Ланг = v = 2 & LANG = EN-US; Path = /; Домен = api.linkedin.com x-ambry-creation-time: ср 10 апреля 09:14:44 UTC 2019 access-control-allow-origin: https://www.linkedin.com content-length: 0

Guzzle - это PHP-клиент HTTP , который упрощает отправку HTTP-запросов и упрощает интеграцию с веб-службами.

  • Простой интерфейс для создания строк запросов, запросов POST, потоковой передачи больших загрузок, потоковой передачи больших загрузок, использования файлов cookie HTTP, загрузки данных JSON и т. Д. *
  • Может отправлять как синхронные, так и асинхронные запросы, используя один и тот же интерфейс. Использует интерфейсы PSR-7 для запросов, ответов и потоков. Это позволяет вам использовать другие PSR-7-совместимые библиотеки с Guzzle.
  • Абстрагирует основной HTTP-транспорт, позволяя писать независимый от среды и транспорта код; т.е. нет жесткой зависимости от циклов cURL, PHP, сокетов или неблокирующих циклов событий.
  • Система промежуточного программного обеспечения позволяет расширять и составлять поведение клиента.
...