recibir data php json rest post file-get-contents

data - recibir json en php post



PHP-Publicar JSON a través de file_get_contents (2)

Este es el código que siempre uso y parece bastante similar (aunque esto es, por supuesto, para x-www-form-urlencoded). Tal vez su username:key debe ser base64_encode ''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); }

Estoy tratando de POSTAR contenido JSON a un punto final REST remoto, sin embargo, el valor ''contenido'' parece estar vacío en la entrega. Todos los demás encabezados, etc., se reciben correctamente, y el servicio web realiza pruebas con éxito con un cliente de prueba basado en navegador.

¿Hay algún problema con mi sintaxis debajo de donde especifico 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;


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 la aplicación / x-www-form-urlencoded de Content-type y pasa un nombre de usuario y una contraseña.

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

Aquí está 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);}

Note la línea: $ opts [''http''] [''header''. = (El punto es igual a adjuntar al elemento de la matriz.)