web-dev-qa-db-fra.com

PHP - Publication de JSON via file_get_contents

J'essaie de POST contenu JSON vers un point de terminaison distant REST, cependant la valeur de "contenu" semble être vide à la livraison. Tous les autres en-têtes, etc. sont en cours reçu correctement et le service Web teste avec succès avec un client de test basé sur un navigateur.

Y a-t-il un problème avec ma syntaxe ci-dessous où je spécifie le champ "contenu"?

$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;
22
Ben

C'est le code que j'utilise toujours et il semble assez similaire (bien que ce soit bien sûr pour x-www-form-urlencoded). Peut-être que votre username:key doit être base64_encode'ré.

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);
}
22
Bob Davies

La réponse antérieure 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);}

est incorrect. Cette fonction fonctionne parfois, mais elle est inexacte et échouera si vous n'utilisez pas le type de contenu d'application/x-www-form-urlencoded et que vous transmettez un nom d'utilisateur et un mot de passe.

Cela fonctionne pour le rédacteur car application/x-www-form-urlencoded est le type de contenu par défaut, mais sa gestion du nom d'utilisateur et du mot de passe écrase la déclaration précédente du type de contenu.

Voici la fonction corrigée:

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

Notez la ligne: $ opts ['http'] ['header'. = (Le point est égal à ajouter à l'élément de tableau.)

5