2012-07-03 40 views
14

que estoy tratando de contenido posterior JSON a un extremo REST a distancia, sin embargo, el valor de 'contenido' parece que está vacío en la entrega. Todos los demás encabezados, etc. se reciben correctamente, y el servicio web prueba satisfactoriamente con un cliente de prueba basado en el navegador.PHP - Desplazamiento a través de JSON file_get_contents

¿Hay un problema con mi sintaxis debajo de donde puedo especificar el campo 'contenido'?

$data = array("username" => "duser", "firstname" => "Demo", "surname" => "User", "email" => "[email protected]"); 
$data_string = json_encode($data); 

$result = file_get_contents('http://test.com/api/user/create', null, stream_context_create(array(
'http' => array(
'method' => 'POST', 
'header' => array('Content-Type: application/json'."\r\n" 
. 'Authorization: username:key'."\r\n" 
. 'Content-Length: ' . strlen($data_string) . "\r\n"), 
'content' => $data_string) 
) 
)); 

echo $result; 

Respuesta

16

Este es el código que siempre uso y se ve bastante similar (aunque esto es, por supuesto, para x-www-form-urlencoded). Quizás su username:key necesite ser 'd.

function file_post_contents($url, $data, $username = null, $password = null) 
{ 
    $postdata = http_build_query($data); 

    $opts = array('http' => 
     array(
      'method' => 'POST', 
      'header' => 'Content-type: application/x-www-form-urlencoded', 
      'content' => $postdata 
     ) 
    ); 

    if($username && $password) 
    { 
     $opts['http']['header'] = ("Authorization: Basic " . base64_encode("$username:$password")); 
    } 

    $context = stream_context_create($opts); 
    return file_get_contents($url, false, $context); 
} 
+1

Gracias ¡Esto funcionó muy bien! – Ben

+4

En caso de que alguien se topa con el problema de que la postdata no está codificado correctamente (cada tecla del diccionario tiene una "amp;" al principio): Cambie la tercera línea a $ Postdatum = http_build_query ($ data, ' ',' &'); – Philipp

3

La respuesta anterior de

function file_post_contents($url, $data, $username = null, $password = null) { 
$postdata = http_build_query($data); 

$opts = array('http' => 
    array(
     'method' => 'POST', 
     'header' => 'Content-type: application/x-www-form-urlencoded', 
     'content' => $postdata 
    ) 
); 

if($username && $password) 
{ 
    $opts['http']['header'] = ("Authorization: Basic " . base64_encode("$username:$password")); 
} 

$context = stream_context_create($opts); 
return file_get_contents($url, false, $context);} 

es incorrecto. Esta función funciona a veces, pero es inexacta y fallará si no está utilizando el tipo de contenido de la aplicación/x-www-form-urlencoded y le da un nombre de usuario y contraseña.

Funciona para el escritor porque la aplicación/x-www-form-urlencoded es el tipo de contenido predeterminado, pero su manejo del nombre de usuario y la contraseña sobrescribe la declaración anterior del tipo de contenido.

Aquí es la función corregida:

function file_post_contents($url, $data, $username = null, $password = null){ 
$postdata = http_build_query($data); 

$opts = array('http' => 
    array(
     'method' => 'POST', 
     'header' => "Content-type: application/x-www-form-urlencoded\r\n", 
     'content' => $postdata 
    ) 
); 

if($username && $password) 
{ 
    $opts['http']['header'] .= ("Authorization: Basic " . base64_encode("$username:$password")); // .= to append to the header array element 
} 

$context = stream_context_create($opts); 
return file_get_contents($url, false, $context);} 

Nota de la línea:. $ opta [ 'http'] [ 'cabecera' = (. De puntos es igual a adjuntar al elemento de la matriz)

Cuestiones relacionadas