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?


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/


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

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.


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.


Gran observación
— nensamuel
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.