Подтвердить что ты не робот

PHP - отправка JSON через файл_get_contents

Я пытаюсь передать содержимое POST JSON на удаленную конечную точку REST, однако значение "content" кажется пустым при доставке. Все остальные заголовки и т.д. Принимаются правильно, и веб-сервис успешно тестируется с помощью тестового клиента на основе браузера.

Есть ли проблема с моим синтаксисом ниже, где я указываю поле 'content'?

$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;
4b9b3361

Ответ 1

Это код, который я всегда использую, и он выглядит довольно похожим (хотя это, конечно, для x-www-form-urlencoded). Возможно, ваш username:key должен быть 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);
}

Ответ 2

Более ранняя реакция

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

неверно. Эта функция работает иногда, но она неточна и сбой, если вы не используете Content-type application/x-www-form-urlencoded, и вы передаете имя пользователя и пароль.

Он работает для писателя, потому что application/x-www-form-urlencoded является стандартным типом контента, но его обработка имени пользователя и пароля перезаписывает более раннее объявление типа содержимого.

Вот исправленная функция:

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

Обратите внимание на строку: $ opts ['http'] ['header'. = (точка равна добавлению к элементу массива.)