Надіслати json-повідомлення за допомогою php


83

У мене є такі JSON-дані:

{ 
    userID: 'a7664093-502e-4d2b-bf30-25a2b26d6021',
    itemKind: 0,
    value: 1,
    description: 'Saude',
    itemID: '03e76d0a-8bab-11e0-8250-000c29b481aa'
}

і мені потрібно розмістити на json url: http: // domain / OnLeagueRest / resources / onleague / Account / CreditAccount

за допомогою php, як я можу надіслати цей запит на публікацію?


2
вкажіть дещо більше деталей або код
jimy 02

Мені просто потрібно надіслати json-повідомлення з ідентифікатором користувача, itemKind, значенням, описом та itemID
Carlos Martins

@Gumbo Chrome не погоджується з вами;)
Філ

3
@Phil: JSON не є JavaScript або навпаки. Chrome може прийняти цей код, оскільки він має інтерпретатор JavaScript. Але якщо ви JSON.parseпроаналізуєте цей код, він точно не вдасться.
Гамбо

@Gumbo Дякую за додаткову інформацію. Проблема в ключах без котирувань?
Філ

Відповіді:


116

Без використання будь-якої зовнішньої залежності або бібліотеки:

$options = array(
  'http' => array(
    'method'  => 'POST',
    'content' => json_encode( $data ),
    'header'=>  "Content-Type: application/json\r\n" .
                "Accept: application/json\r\n"
    )
);

$context  = stream_context_create( $options );
$result = file_get_contents( $url, false, $context );
$response = json_decode( $result );

$ response - це об'єкт. Доступ до властивостей можна отримати як зазвичай, наприклад $ response -> ...

де $ data - це масив, що містить ваші дані:

$data = array(
  'userID'      => 'a7664093-502e-4d2b-bf30-25a2b26d6021',
  'itemKind'    => 0,
  'value'       => 1,
  'description' => 'Boa saudaÁ„o.',
  'itemID'      => '03e76d0a-8bab-11e0-8250-000c29b481aa'
);

Попередження : це не спрацює, якщо для параметра allow_url_fopen у php.ini встановлено значення Вимкнено .

Якщо ви розробляєте для WordPress , розгляньте можливість використання наданих API: https://developer.wordpress.org/plugins/http-api/


1
Я знаю, що запізнився на роки, але чи можна за допомогою цього методу отримати відповідь на заголовки відповідей?
solarshado

3
Чудово, дякую, що згадали про те, що робите це без будь-яких розширень!
joonas.fi

Без розширень завжди вітається. Я не знав, що WP мав стандартизований API для цього. Ще одна подяка за цю частинку інформації!
Ведран Шего

2
Заголовки необробленої відповіді @solarshado можна отримати за допомогою stream_get_meta_data .
Daniels118,

1
Невелика пропозиція щодо вдосконалення, ви також можете помістити заголовки в масив, особливо якщо потрібно додати більше заголовків, таких як Авторизація. У цьому випадку "\ r \ n" не слід додавати.
zero0cool

135

Ви можете використовувати CURL для цієї мети, див. Приклад коду:

$url = "your url";    
$content = json_encode("your data to be sent");

$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER,
        array("Content-type: application/json"));
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $content);

$json_response = curl_exec($curl);

$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);

if ( $status != 201 ) {
    die("Error: call to URL $url failed with status $status, response $json_response, curl_error " . curl_error($curl) . ", curl_errno " . curl_errno($curl));
}


curl_close($curl);

$response = json_decode($json_response, true);

1
У мене є більше значень, ніж у JSON - Так, у мене також є значення JSON .. Як це зробити зараз? У мене є три значення для опублікування: title = somevalue & hash = somevalue & json = JSON VALUE. Тепер як це зробити за допомогою php?
СВІТЛО

1
Це не спрацювало в моїй ситуації ( stackoverflow.com/questions/34021817/… ). Мої nodejs отримали {}. Маєте ідею чому?
Fane

Якщо порівняти цей і нативний file_get_contentsметод, вони мають приблизно однакову швидкість
Брайан Лейшман,


@LIGHT - $content = http_build_query( array( 'key1' => 'value1', 'key2' => 'value2', 'json' => json_encode($array_to_become_json) ) );там, де ви готувались $array_to_become_json = array(...)раніше.
ToolmakerSteve

0

серйозно використовуйте CURL luke :), це один з найкращих способів це зробити І ви отримаєте відповідь.


10
завивка не завжди ввімкнена ... іноді це потрібно для того, щоб зробити по-старому ...
Бенджамін Екштейн

0

Пам'ятайте, що рішення file_get_contents не закриває з'єднання, як слід, коли сервер повертає Connection: close у заголовку HTTP.

З іншого боку, рішення CURL розриває з'єднання, тому скрипт PHP не блокується очікуванням відповіді.


Чудове спостереження
Ненсамуель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.