POST-запрос к PHP REST API работает только на Postman - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь создать и получить доступ к своему первому API отдыха, и у меня возникают проблемы с запросами POST .Если я тестирую свой API на Почтальоне , он работает просто отлично.Я могу читать, удалять и т. Д.

Но теперь я хочу отправить данные html формы с помощью PHP в мой API для создания новой записи в базе данных.Я использую только PHP и Mysql для проекта.И я попытался использовать CURL и file_gets_content , но безуспешно.

В результате получается, что массив, который получает API, всегда пуст .Я отлаживаю каждый шаг прямо перед вызовом, и массив не пустой, поэтому я представляю, что с самим вызовом что-то не так.

Вот часть моего create.php получает данные по моему API:

<?php  
//configuracao de headers
// Headers
header('Access-Control-Allow-Origin: *');
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Methods: POST");
header("Access-Control-Max-Age: 3600");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");

include_once('../../config/Banco.php');
include_once('../../models/Curso.php');

$banco = new Banco();
$conexao = $banco->conecta();

$curso = new Curso($conexao);

//pega o q foi submetido
$data = json_decode(file_get_contents("php://input"));

if (empty($data->id_sala)){
    echo json_encode(array('mensagem'=>'Preencha o id_sala'));
    die();
}

И это часть функции, которую я использую для вызова метода создания моего API:

function criar_curso($nome, $id_professor, $id_sala, $horario_inicio, $horario_fim){

    $url = "http://localhost/desafio-fullstack/api/curso/create.php";

    // Parametros da requisição
    $data = http_build_query(array(
        'nome' => $nome,
        'id_professor' => $id_professor,
        'id_sala' => $id_sala,
        'horario_inicio' => $horario_inicio,
        'horario_fim' => $horario_fim
    ));

    $context = stream_context_create(array(
        'http' => array(
            'method' => 'POST',                    
            'header' => "Connection: close\r\n".
            "Content-type: application/x-www-form-urlencoded\r\n".
            "Content-Length: ".strlen($data)."\r\n",
            'content' => $data                               
        )
    ));

    $contents = file_get_contents($url, null, $context);            
    $resposta = json_decode($contents);  //Parser da resposta Json
    var_dump($resposta);
    die('antes do direcionamento dentro do criar curso');

Здесь я хранюполучение сообщения внутри if , которое проверяет, является ли $ data-> id_sala пустым.Но когда я отправляю те же данные с помощью Postman, они не пустые.Для целей первого API я хочу использовать только чистый PHP.Никаких внешних библиотек вроде Guzzle или чего-то в этом роде.Итак, кто-нибудь может мне помочь?

ОБНОВЛЕНИЕ: Изменяя заголовок при вызове для отправки в формате json, я смог правильно отправить данные в API:

$opcoes = array(
        'http' => array(
            'header'  => "Content-type: application/json\r\n",
            'method'  => 'POST',
            'content' => json_encode($data)
        )
    );
    $context  = stream_context_create($opcoes);
    $retorno = file_get_contents($url, false, $context);

Спасибо за помощь.

1 Ответ

0 голосов
/ 19 декабря 2018

Вы отправляете:

"Content-type: application/x-www-form-urlencoded\r\n".

… но пытаетесь прочитать:

json_decode(file_get_contents("php://input"));

Поскольку вы не отправляете JSON, это не удается.

Просто прочитайте данные в кодировке URL из $_POST.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...