Enviar publicación json usando php

83

Tengo estos datos json:

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

y necesito publicar en json url: http: // dominio / OnLeagueRest / resources / onleague / Account / CreditAccount

usando php, ¿cómo puedo enviar esta solicitud de publicación?

Carlos Martins
fuente
2
dar más detalles o código
jimy
Solo necesito enviar una publicación json con userID, itemKind, valor, descripción y itemID
Carlos Martins
@Gumbo Chrome no está de acuerdo contigo;)
Phil
3
@Phil: JSON no es JavaScript o viceversa. Chrome podría aceptar ese código porque tiene un intérprete de JavaScript. Pero si usa JSON.parsepara analizar ese código, definitivamente fallará.
Gumbo
@Gumbo Gracias por la información adicional. ¿El problema son las claves sin comillas?
Phil

Respuestas:

116

Sin usar ninguna dependencia o biblioteca externa:

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

$ respuesta es un objeto. Se puede acceder a las propiedades como de costumbre, por ejemplo, $ respuesta -> ...

donde $ data es la matriz que contiene sus datos:

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

Advertencia : esto no funcionará si la configuración allow_url_fopen está desactivada en php.ini.

Si está desarrollando para WordPress , considere usar las API proporcionadas: https://developer.wordpress.org/plugins/http-api/

David Riccitelli
fuente
1
Sé que llego años tarde, pero ¿es posible acceder a los encabezados de respuesta con este método?
solarshado
3
¡Genial, gracias por mencionar que ha hecho esto sin extensiones!
joonas.fi
Sin extensiones siempre es bienvenido. No sabía que WP tenía una API estandarizada para esto. ¡Gracias adicionales por esa información!
Vedran Šego
2
Los encabezados de respuesta sin procesar de @solarshado se pueden recuperar con stream_get_meta_data .
Daniels118
1
Una pequeña sugerencia de mejora, también puede poner los encabezados en una matriz, especialmente si es necesario agregar más encabezados como Autorización. En ese caso, no se debe agregar "\ r \ n" .
zero0cool
135

Puede usar CURL para este propósito, vea el código de ejemplo:

$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
fuente
1
Tengo algunos valores más que JSON. Sí, también tengo un valor JSON. ¿Cómo lo hago ahora? Tengo tres valores en total para publicar: title = somevalue & hash = somevalue & json = JSON VALUE. Ahora, ¿cómo hacer esto usando php?
LUZ
1
Esto no funcionó en mi situación ( stackoverflow.com/questions/34021817/… ). Mis nodejs recibieron {}. ¿Tienes idea de por qué?
Fane
Si compara esto y el file_get_contentsmétodo nativo , tienen aproximadamente la misma velocidad
Brian Leishman
@LIGHT: $content = http_build_query( array( 'key1' => 'value1', 'key2' => 'value2', 'json' => json_encode($array_to_become_json) ) );donde te preparaste $array_to_become_json = array(...)antes.
ToolmakerSteve
0

usa CURL luke :) en serio, esa es una de las mejores formas de hacerlo Y obtienes la respuesta.

Knobik
fuente
10
curl no siempre está habilitado ... a veces lo necesitas para hacerlo a la antigua ...
Benjamin Eckstein
0

Tenga en cuenta que la solución file_get_contents no cierra la conexión como debería cuando un servidor devuelve Connection: close en el encabezado HTTP.

La solución CURL, por otro lado, finaliza la conexión para que el script PHP no se bloquee esperando una respuesta.

OndrejC
fuente
Gran observación
nensamuel