Sende json post mit php

82

Ich habe diese JSON-Daten:

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

und ich muss in json url posten: http: // domain / OnLeagueRest / resources / onleague / Account / CreditAccount

Wie kann ich mit PHP diese Post-Anfrage senden?

Carlos Martins
quelle
2
Geben Sie einige weitere Details oder Code
Jimy
Ich muss nur json Post mit Benutzer-ID, itemKind, Wert, Beschreibung und itemID senden
Carlos Martins
@ Gumbo Chrome ist nicht einverstanden mit Ihnen;)
Phil
2
@Phil: JSON ist kein JavaScript oder umgekehrt. Chrome akzeptiert diesen Code möglicherweise, da er über einen JavaScript-Interpreter verfügt. Wenn Sie JSON.parsediesen Code jedoch analysieren, schlägt er definitiv fehl.
Gumbo
@ Gumbo Danke für die zusätzlichen Informationen. Ist das Problem die nicht zitierten Schlüssel?
Phil

Antworten:

113

Ohne Verwendung einer externen Abhängigkeit oder Bibliothek:

$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 ist ein Objekt. Auf Eigenschaften kann wie gewohnt zugegriffen werden, zB $ response -> ...

Dabei ist $ data das Array, das Ihre Daten enthält:

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

Warnung : Dies funktioniert nicht, wenn die Einstellung allow_url_fopen in der php.ini auf Off gesetzt ist.

Wenn Sie für WordPress entwickeln , sollten Sie die bereitgestellten APIs verwenden: https://developer.wordpress.org/plugins/http-api/

David Riccitelli
quelle
1
Ich weiß, dass ich Jahre zu spät bin, aber ist es mit dieser Methode möglich, an die Antwortheader zu gelangen?
Solarshado
1
Super, danke, dass du erwähnt hast, dass du dies ohne Erweiterungen machst!
joonas.fi
Ohne Erweiterungen ist immer willkommen. Ich wusste nicht, dass WP eine standardisierte API dafür hat. Extra danke für diese Info!
Vedran Šego
2
@solarshado Raw-Antwortheader können mit stream_get_meta_data abgerufen werden .
Daniels118
1
Als kleiner Verbesserungsvorschlag können Sie die Header auch in ein Array einfügen, insbesondere wenn weitere Header wie die Autorisierung hinzugefügt werden müssen. In diesem Fall sollte das "\ r \ n" nicht hinzugefügt werden.
zero0cool
136

Sie können CURL für diesen Zweck verwenden, siehe Beispielcode:

$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);
Muhammad Zeeshan
quelle
1
Ich habe mehr Werte als JSON - Ja, ich habe auch JSON-Werte. Wie mache ich das jetzt? Ich muss insgesamt drei Werte veröffentlichen: title = somevalue & hash = somevalue & json = JSON VALUE. Wie mache ich das mit PHP?
LIGHT
1
Dies hat in meiner Situation nicht funktioniert ( stackoverflow.com/questions/34021817/… ). Meine Knoten haben {} erhalten. Hast du eine Idee warum?
Fane
Wenn Sie diese und die native file_get_contentsMethode vergleichen, sind sie ungefähr gleich schnell
Brian Leishman
@LIGHT - $content = http_build_query( array( 'key1' => 'value1', 'key2' => 'value2', 'json' => json_encode($array_to_become_json) ) );wo du $array_to_become_json = array(...)früher vorbereitet hast .
ToolmakerSteve
0

benutze CURL luke :) im Ernst, das ist eine der besten Möglichkeiten, es zu tun UND du bekommst die Antwort.

Knobik
quelle
9
Curl ist nicht immer aktiviert ... manchmal braucht man es, um die
Benjamin Eckstein
0

Beachten Sie, dass die Datei file_get_contents die Verbindung nicht wie gewünscht schließt, wenn ein Server Connection: close im HTTP-Header zurückgibt .

Die CURL-Lösung beendet andererseits die Verbindung, sodass das PHP-Skript nicht durch Warten auf eine Antwort blockiert wird.

OndrejC
quelle
Tolle Beobachtung
Nensamuel