API REST na saída PHP para extensão de arquivo JSON

Então eu quero escrever uma API REST em PHP para JSON para consumo no iPhone, mas também muitos sites e dispositivos. Eu tenho o código abaixo, quando acessado através de uma instrução GET, retorna um arquivo como:

1mdi2o3.part

Como faço para retornar algo como: users.json

$db->setQuery( "SELECT * FROM users"); $db->query() or die($queryError); $numRows = $db->getNumRows(); $row = $db->loadObjectList(); // PRINT JSON FILE header("Content-type: application/json"); for($i = 0 ; $i < $numRows; $i++){ $json_output[$i] = $row[$i]; } $MYjson_output = json_encode($json_output); echo $MYjson_output; 

Não é inteiramente qual é o seu objective, mas aqui estão 3-4 soluções que podem funcionar:

Soluções Comuns

Reescrever

Esta é a maneira mais convencional de obter URIs limpos para sua API. Se você quiser que a parte do usuário do user.json seja dinâmica, você pode usar o mod_rewrite (assumindo novamente o Apache) para rewrite seus URLs para um script do manipulador do php. Se você estiver indo a rota de URL de estilo RESTful convencional, você provavelmente irá querer usar isso de qualquer maneira para obter URLs limpos / separados.

 # For grabbing all users RewriteEngine on RewriteRule ^users\.json rest.php [L] # For grabbing one particular user RewriteEngine on RewriteRule ^([a-z0-9]+)\.json rest.php?user=$1 [L] 

Onde rest.php é o script do manipulador PHP.

Reescrita de URL sem mod-rewrite

Se você não quiser usar mod_rewrite, você também pode fazer algo como

 example.com/rest.php/users.json example.com/rest.php/user-id.json 

ou mesmo

 example.com/rest.php/user-id example.com/rest.php/user/user-id 

Onde rest.php é o script do manipulador PHP. Você pode pegar o user-id do user-id do URL (ou URI se estamos falando termos RESTful) usando o $_SERVER global com $_SERVER['REQUEST_URI'] .

Outras soluções

Alterando o nome do download via Content-Disposition:

Eu acredito que você deseja adicionar o header Content-Disposition …

  

Isso forçará o arquivo a ser baixado como user.json. Isso geralmente não é o comportamento esperado para uma API REST, mas, da maneira como sua pergunta foi redigida, achei que eu iria jogá-lo lá fora.

AddHandler (ou AddType)

Supondo que você esteja executando um servidor Apache, você também pode usar a diretiva AddHandler para que os arquivos de extensão .json sejam tratados como se fossem php.

 AddHandler application/x-httpd-php .json 

Aviso: outros arquivos .json simples serão tratados como PHP, então você provavelmente deseja configurar isso em um arquivo .htaccess no diretório com o script PHP. Isso funcionaria bem para este URI, mas não é ideal se você estivesse expondo muitos URIs

Bem-vindo ao SO. Você já considerou usar o framework Zend para esta aplicação? Eu escrevi sobre esse tópico antes , e se você usar Zend provavelmente poderia ser de ajuda adicional. Certamente, ajudaria você a superar o básico.

HTH

-aj

O problema é esta linha:

 header("Content-type: application/json"); 

Eu sei que isso parece ser o caminho certo para fazer (afinal, o application/json é o tipo MIME oficial para o conteúdo JSON), mas faz com que a maioria dos navegadores apresente uma checkbox de diálogo de download de arquivos, quando você quiser apenas ver o texto. Você pode usar a codificação de text/plain planilha para evitar isso. Observe que seu aplicativo AJAX / iPhone / … provavelmente não se preocupa com o tipo de conteúdo, então sua API funcionará em ambos os casos.

Veja também esta publicação no blog que fornece mais algum contexto.