114 votes

Envoyer un message json à l'aide de php

J'ai ces données json :

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

et j'ai besoin de poster dans l'url json : http://domain/OnLeagueRest/resources/onleague/Account/CreditAccount

en utilisant php, comment puis-je envoyer cette demande de poste ?

2 votes

Donnez plus de détails ou un code

0 votes

J'ai juste besoin d'envoyer un message json avec userID, itemKind, value, description et itemID.

0 votes

@Gumbo Chrome n'est pas d'accord avec toi ;)

167voto

Muhammad Zeeshan Points 5497

Vous pouvez utiliser CURL à cette fin, voir le code d'exemple :

$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 votes

J'ai d'autres valeurs que JSON - Oui, j'ai aussi des valeurs JSON Comment dois-je faire ? J'ai au total trois valeurs à afficher : title=somevalue&hash=somevalue&json = JSON VALUE . Maintenant, comment faire cela en utilisant php ?

1 votes

Cela n'a pas fonctionné dans ma situation ( stackoverflow.com/questions/34021817/ ). Mon nodejs a reçu {}. Vous savez pourquoi ?

0 votes

Si vous faites un test de référence sur ce point et sur le file_get_contents méthode, ils sont à peu près à la même vitesse

158voto

David Riccitelli Points 2787

Sans en utilisant une dépendance ou une bibliothèque externe :

$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 );

$réponse est un objet. On peut accéder aux propriétés comme d'habitude, par ex. $réponse->...

$data est le tableau contenant vos données :

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

Avertissement : cela ne fonctionnera pas si le allow_url_fopen est réglé sur Off dans le php.ini.

Si vous développez pour WordPress envisagez d'utiliser les API fournies : https://developer.wordpress.org/plugins/http-api/

1 votes

Je sais que j'ai des années de retard, mais est-il possible d'obtenir les en-têtes de réponse avec cette méthode ?

4 votes

Génial, merci d'avoir mentionné le fait de faire cela sans aucune extension !

0 votes

Sans extension est toujours la bienvenue. Je ne savais pas que WP avait une API standardisée pour cela. Merci beaucoup pour cette information !

16voto

Phil Points 48960

Mise à jour

C'est une réponse assez ancienne. Je trouve que le Bibliothèque Guzzle très facile à utiliser pour travailler avec HTTP en PHP.


Avez-vous réellement besoin d'envoyer des données JSON ? Si c'est le cas, il s'agit d'un message HTTP brut.

La meilleure méthode que je connaisse pour faire cela est le client HTTP de Zend Framework.

Voir ici pour les détails du poste brut - http://framework.zend.com/manual/en/zend.http.client.advanced.html#zend.http.client.raw_post_data

Ce serait quelque chose comme

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

$json = json_encode($data);

$client = new Zend_Http_Client($uri);
$client->setRawData($json, 'application/json')->request('POST');

2voto

OndrejC Points 1

Attention fichier_get_contenu ne ferme pas la connexion comme il se doit lorsqu'un serveur retourne Connexion : close dans l'en-tête HTTP.

La solution CURL, quant à elle, met fin à la connexion afin que le script de PHP ne soit pas bloqué par l'attente d'une réponse.

2 votes

Grande observation

-1voto

Knobik Points 197

Utilisez CURL luke :) sérieusement, c'est l'une des meilleures façons de le faire ET vous obtenez la réponse.

12 votes

Curl n'est pas toujours activé ... parfois vous avez besoin de le faire à l'ancienne ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X