对PHP REST API的POST请求仅适用于邮递员

时间:2018-12-19 14:56:41

标签: php rest api curl post

我正在尝试创建和访问我的第一个Rest API,但遇到 POST 请求时遇到了麻烦。如果我在 Postman 上测试了我的API,它就可以正常工作。我可以阅读,删除等。

但是现在我想使用PHP将 html表单的数据发送到我的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的create方法的函数的一部分:

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 :(得分:1)

您正在发送:

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

…但尝试阅读:

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

由于您未发送JSON,因此失败。

只需从$_POST中读取URL编码数据即可。