Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

DannyND

WebService em REST

Recommended Posts

Ao criar a função inserir_pedidos(), voc6e está fazendo assim:

function inserir_pedidos() { 
//...
}

E deve ser assim:

function inserir_pedidos( $post ) { 
//...
}

Perceba que deve inserir o parâmetro $post ao criar a função. Se está recebendo a mensagem "Dados inválidos", é porque o método HTTP é POST, não está vazio e está chamando corretamente a função para inserir. Experimente fazer esta mudança e retorne aqui com o resultado.

 

Outro ponto é aqui:

if ( empty( $cd_cliente ) || empty( $id_status ) ) {

Deveria ser:

if ( empty( $cd_cliente ) || empty( $cd_cliente ) ) {

E também não use o

require_once('mysqli.php');

Dentro da função. Use fora, no começo do código para poder reutilizar em outras função e poupar processamento. Aí para usar a variável deste arquivo dentro da função, use:

global $MySQLi;

Logo no começo da função.

 

***Estes exemplos são apenas didáticos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Jonaslhp,

 

A minha dúvida era exatamente como filtrar e tratar as os dados vindos do POST.

Estou fazendo da seguinte forma:

 

<?php
/* apenas envia os pedidos */
    require 'pedidos_acoes.php';
    
    switch( $_SERVER['REQUEST_METHOD'] ) {
        case 'POST':
            //chama função para inserir pedidos
			$post = filter_input_array( INPUT_POST , array(
				'cd_cliente'  => FILTER_SANITIZE_STRING,
				'id_status'   => FILTER_SANITIZE_STRING,
			) );

			if ( count( $_POST ) > 0 && count( $post ) > 0 ) {

				echo inserir_pedidos( $post );
			} else {
				echo json_encode( 'Post inválido' );
			}

            break;
        default:
            echo json_encode( 'Método HTTP não permitido.' );
            break;
    }



<?php
    function inserir_pedidos()
    { 
		require_once('mysqli.php');

		$cd_cliente = $post['cd_cliente'];
        $id_status  = $post['id_status'];

        if ( empty( $cd_cliente ) || empty( $cd_cliente ) ) {
            return json_encode( 'Dados invalidos' );
        }

        $sql = "INSERT INTO ti_pedidos (cd_cliente,id_status) VALUES ('".$cd_cliente."', '".$id_status."');";
        $query = mysqli_query( $sql );
        if ( $query ) {

            return json_encode( array( 'id' => (int)mysqli_insert_id( $MySQLi ) ) );
        }
    }

Mas está retornando "Dados inválidos".

Já estava usando o Postman do Chorme para as requisições, mas o POST não funciona "/

 

TESTE NO CHORME:

arquivos.png

 

Ao criar a função inserir_pedidos(), voc6e está fazendo assim:

function inserir_pedidos() { 
//...
}

E deve ser assim:

function inserir_pedidos( $post ) { 
//...
}

Perceba que deve inserir o parâmetro $post ao criar a função. Se está recebendo a mensagem "Dados inválidos", é porque o método HTTP é POST, não está vazio e está chamando corretamente a função para inserir. Experimente fazer esta mudança e retorne aqui com o resultado.

 

Outro ponto é aqui:

if ( empty( $cd_cliente ) || empty( $id_status ) ) {

Deveria ser:

if ( empty( $cd_cliente ) || empty( $cd_cliente ) ) {

E também não use o

require_once('mysqli.php');

Dentro da função. Use fora, no começo do código para poder reutilizar em outras função e poupar processamento. Aí para usar a variável deste arquivo dentro da função, use:

global $MySQLi;

Logo no começo da função.

 

***Estes exemplos são apenas didáticos.

 

 

FUNCIONOU ... segue os códigos:

 

pedidos.php

<?php
/* apenas envia os pedidos */
require 'pedidos_acoes.php';

switch( $_SERVER['REQUEST_METHOD'] ) {
	case 'POST':
		//chama função para inserir pedidos
		$post = filter_input_array( INPUT_POST , array(
			'cd_cliente'  => FILTER_SANITIZE_STRING,
			'id_status'   => FILTER_SANITIZE_STRING,
		) );

		if ( count( $_POST ) > 0 && count( $post ) > 0 ) {

			echo inserir_pedidos( $post );
		} else {
			echo json_encode( 'Post inválido' );
		}

		break;
	default:
		echo json_encode( 'Método HTTP não permitido.' );
		break;
}

pedidos_acoes.php

<?php
function inserir_pedidos($post)
{ 
	require_once('mysqli.php');

	$cd_cliente = $post['cd_cliente'];
	$id_status  = $post['id_status'];

	if ( empty( $cd_cliente ) || empty( $id_status ) ) {
		return json_encode( 'Dados invalidos' );
	}

	$sql = "INSERT INTO ti_pedidos (cd_cliente,id_status) VALUES ('".$cd_cliente."', '".$id_status."');";
	$query = $MySQLi->query($sql) OR trigger_error($MySQLi->error, E_USER_ERROR);
	if ( $query ) {

		return json_encode( array( 'id' => (int)mysqli_insert_id( $MySQLi ) ) );
	}
}

 

Muito obrigada pela ajuda.. vou marcar como Resolvido =D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Leu o post #21?

 

Li sim, mas só vi depois que tinha mandando o outro post.. desculpe rsrs

Valeu pela ajuda o>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma última dúvida:

 

Quando a requisição é por ID, é obrigatório que seja inteiro?
Tenho uma tabela que o ID é o código do produto e nesse código pode existir letras entre os números.

 

Exemplo: http://127.0.0.1/site/produtos/F000600188

O começo da minha função é esse:

 

function listar_produto_por_id($id)
{
   require_once('mysqli.php');
   $id = (int)$id;
   $sql = "SELECT cd_produto, nm_produto FROM ti_produtos where cd_produto='".$id."'";

....

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não é obrigatório, usei no exemplo mais como um caguete (?) mesmo...No PHP + MySQL, costumo criar o ID sendo um campo numérico com auto incremento... Para validar, você pode fazer assim:

$id = filter_var($id, FILTER_SANITIZE_STRING);
$sql = "SELECT cd_produto, nm_produto FROM ti_produtos where cd_produto='".$id."'";

Ou ainda utilizar expressões regulares:

$id = preg_replace("/[0-9a-z]/i", "", $id);
$sql = "SELECT cd_produto, nm_produto FROM ti_produtos where cd_produto='".$id."'";

Com a expressão acima, o preg_replace vai limpar a variável retirando tudo que não for número ou letra de a-z.
Enfim, pode fazer a validação que quiser, ou melhor, a validação necessária para cada caso. Não é obrigatório usar o ID como um número inteiro não. :coolio:

 

 

 




			
		

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não passa para a function quando é alfanumérico .. nem sequer aparece no "echo", mas se envio um ID inteiro, aparece normalmente.. poxa vida huahuahuha

 

function listar_produto_por_id($id)
{ 
   echo filter_var($id, FILTER_SANITIZE_STRING);
   exit();

...
}


 

Não passa para a function quando é alfanumérico .. nem sequer aparece no "echo", mas se envio um ID inteiro, aparece normalmente.. poxa vida huahuahuha

 

function listar_produto_por_id($id)
{ 
   echo filter_var($id, FILTER_SANITIZE_STRING);
   exit();

...
}

 

Será que não é por causa do meu .htaccess?

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?pg=$1

Compartilhar este post


Link para o post
Compartilhar em outros sites
<?php
    require 'produtos_acoes.php';
    
    switch( $_SERVER['REQUEST_METHOD'] ) {
        case 'GET':
			echo $id;
			//chama função para visualizar o usuário
            if ($id <> '' or $id <> '') {
                echo listar_produto_por_id($id);
            } else {
                echo listar_todos_produtos();
            }
            break;
        default:
            echo json_encode( 'Metodo HTTP nao permitido.' );
            break;
    }

Está assim.. o echo $id é apenas um teste.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só tem isso? Cadê a variável que recupera e guarda o valor vindo do GET? Acho que deveria ser algo assim:

case 'GET':
    $id = preg_replace("/[^0-9a-z]/i", "", $_GET['id']);
    //chama função para visualizar o usuário 
    if ($id <> '' or $id <> '') { 
        echo listar_produto_por_id($id);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Com as expressões regulares não funciona nem a ID como inteiro.

 

Está passando zerado quando é "alfa"

 

<?php
    require 'produtos_acoes.php';
    
    switch( $_SERVER['REQUEST_METHOD'] ) {
        case 'GET':

	    $id = filter_var($id, FILTER_SANITIZE_STRING);

	    //chama função para visualizar o usuário
            if ($id <> '' or $id <> '0') {
                echo listar_produto_por_id($id);
            } else {
                echo listar_todos_produtos();
            }
            break;
        default:
            echo json_encode( 'Metodo HTTP nao permitido.' );
            break;
    }
function listar_produto_por_id($id)
{ 

require_once('mysqli.php');
$sql = "SELECT cd_produto, nm_produto FROM ti_produtos where and cd_produto='".$id."'";
$query = $MySQLi->query($sql) OR trigger_error($MySQLi->error, E_USER_ERROR);
if ( mysqli_num_rows( $query ) > 0 ) {
	$retorno = array();
	while( $resultado = mysqli_fetch_array( $query ) ) {
		$retorno[] = array(
			'cd_produto' => $resultado['cd_produto'],
			'nm_produto' => htmlentities($resultado['nm_produto'])
		);
	}

	echo json_encode( array( 'content' => $retorno ) );
} else {
	echo json_encode( array( 'msg' => 'Nenhum produto disponível.' ) );
}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

lembrando que o filter_var faria mais sentido dentro da função. Como está usando fora dela, experimente trocar:

$id = filter_var($id, FILTER_SANITIZE_STRING);

Por:

$id = filter_input( INPUT_GET, 'id', FILTER_SANITIZE_STRING );

Se não funcionar, logo após

case 'GET':


Coloque isto e retorne com o resultado:

var_dump($_GET); exit;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Usando a requisição dessa forma:

http://127.0.0.1/servidor/produtos/F000600188

<?php
    require 'produtos_acoes.php';
    
    switch( $_SERVER['REQUEST_METHOD'] ) {
        case 'GET':

	    $id = filter_input( INPUT_GET, 'id', FILTER_SANITIZE_STRING );
	    var_dump($_GET); exit;

	    //chama função para visualizar o usuário
            if ($id <> '' or $id <> '0') {
                echo listar_produto_por_id($id);
            } else {
                echo listar_todos_produtos();
            }
            break;
        default:
            echo json_encode( 'Metodo HTTP nao permitido.' );
            break;
    }

Retorna no dump:

array(1) { ["pg"]=> string(19) "produtos/F000600188" }

 

Retirando o exit, passa vazio para produtos_acoes.php, tanto com ID inteiro, quanto alfa. .tá complicado rsrs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Foco:

 

	    var_dump($_GET);

Retorna no dump: [inline]array(1) { ["pg"]=> string(19) "produtos/F000600188" }[/inline]

 

Será que não é por causa do meu .htaccess?

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?pg=$1

 

Bingo!

 

index.php?pg=$1

 

Vamos tentar com [inline]index.php?id=$1[/inline] ???

Provavelmente vai quebrar alguma outra coisa que já esteja funcionando, mas resolve este problema...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode resolver (ou gambiarrar) de três maneiras, ao meu ver.

 

1) Usando querystrings

Mude seu .htaccess para o seguinte:

RewriteRule ^(.*)$ index.php?pg=$1 [QSA]

Perceba a sigla [QSA]. Isso vai garantir que a reescrita do htaccess addicione as querystrings da URL. Aí você pode fazer a chamada assim:

 

/produtos?id=1

 

Usando um var_dump($_GET), seu retorno seria mais ou menos isso:

array(2) {
["pg"]=>
string(8) "usuarios"
["id"]=>
string(10) "F000600188"
}

Poderá até mesmo usar vários parâmetros em outros casos...Por exemplo: /usuarios?id=1&cidade=SP

 

2) Usando uma combinação de list() e explode(). Mantenha seu .htaccess da maneira que está, e, no arquivo que recebe o método HTTP (produtos.php), use um código mais ou menos assim:

list( $page, $id ) = explode( '/', $_GET['pg'] );

$page   = filter_var( $page, FILTER_SANITIZE_STRING );
$id     = filter_var( $id, FILTER_SANITIZE_STRING );

E aí estarão a página requisitada e o ID desejado...

 

3) Fazer um mapeamento de rotas/reescrita manual no .htaccess. Exemplo:

RewriteEngine On
RewriteRule ^produtos/?$ produtos.php
RewriteRule ^produtos/(.*)/?$ produtos.php?id=$1

É manual, mais fica mais fácil de adicionar e editar as rotas existentes... Aí você pode adicionar quantas rotas quiser, e personalizar de acordo com cada caso, fica flexível...Pois cada serviço do teu webservice pode ter uma estrutura de URLs diferentes...

 

Sinceramente, são as formas que pensei para resolver isto. Não sei se são gambiarras, más práticas ou afins, mas podem resolver teu problema.

Desculpe a imperícia no assunto :blush:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa.. deu certo da seguinte forma:

 

.htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?pg=$1

produtos.php

<?php
    require 'produtos_acoes.php';
    
    switch( $_SERVER['REQUEST_METHOD'] ) {
        case 'GET':

	    list( $page, $id ) = explode( '/', $_GET['pg'] );
	    $page   = filter_var( $page, FILTER_SANITIZE_STRING );
	    $id     = filter_var( $id, FILTER_SANITIZE_STRING );
	    
            //chama função para visualizar o usuário
            if ($id <> '') {
                echo listar_produto_por_id($id);
            } else {
                echo listar_todos_produtos();
            }
            break;
        default:
            echo json_encode( 'Metodo HTTP nao permitido.' );
            break;
    }

produtos_acoes.php

function listar_produto_por_id($id)
{ 

require_once('mysqli.php');
$sql = "SELECT cd_produto, nm_produto FROM ti_produtos where cd_produto='".$id."'";
$query = $MySQLi->query($sql) OR trigger_error($MySQLi->error, E_USER_ERROR);
	if ( mysqli_num_rows( $query ) > 0 ) {
		$retorno = array();
		while( $resultado = mysqli_fetch_array( $query ) ) {
			$retorno[] = array(
				'cd_produto' => $resultado['cd_produto'],
				'nm_produto' => htmlentities($resultado['nm_produto'])
		);
		}

		echo json_encode( array( 'content' => $retorno ) );
	} else {
		echo json_encode( array( 'msg' => 'Nenhum produto disponível.' ) );
	}
}

Valeu Jonaslhp o>

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.