Slim JSON Outputs

Estou usando o framework Slim com o PHP para criar uma API RESTful para o meu aplicativo. No entanto, eu assumi que a estrutura teria alguma maneira de criar saídas JSON mais fáceis do que apenas exit($jsonEncodedVariable); .

Estou faltando alguma coisa na estrutura, ou eu preciso usar json_encode()exit($json) … para cada método?

Todos os dados são retirados do meu database MySQL e, em seguida, serão colocados em uma matriz JSON, dependendo do pedido REST chamado.

Por exemplo, se /api/posts/all foi solicitado, eu exit() uma matriz JSON de todas as postagens que cada valor para sua própria chave, "value" : key .

Minha pergunta é, existe uma maneira fácil, usando a estrutura slim, para exit() ‘ing código JSON em vez de sair como texto simples?

 header("Content-Type: application/json"); echo json_encode($result); exit; 

Dica: Usando o Slim PHP Framework para desenvolver APIs REST

Por que não usar apenas o object de resposta do Slim? (também … por que sair?)

 $dataAry = // Some data array $response = $app->response(); $response['Content-Type'] = 'application/json'; $response['X-Powered-By'] = 'Potato Energy'; $response->status(200); // etc. $response->body(json_encode($dataAry)); // Or echo json_encode($dataAry) 

Deixe-me prefácio dizendo que ainda me considero um noob, então, se eu estiver fazendo erros, corrija-me para que eu possa aprender. Mas, eu estava brincando com um problema / pergunta semelhante e achei que eu poderia tocar com 2 centavos e arquivar um pouco mais de discussão sobre o assunto. Mais informações sobre Slim on Stack melhor.

Eu estava basicamente tocando com o mesmo e percebi que você estava usando a saída ; No começo, eu estava usando a saída também porque o eco estava incluindo um monte de HTML e ocultava o que estava sendo retornado para a minha chamada AJAX. Quando eu usei a saída, limpa o HTML, mas o object de resposta Slim não estava mudando os headers de resposta conforme eu definisse (veja o código acima).

O que eu percebi foi que não é assim que o Slim foi projetado para funcionar. Use eco, não saia. NOTA – Slim Doc:

Sempre que você faz eco () do conteúdo de uma chamada de retorno de rota, o conteúdo de echo () ‘é capturado> em um buffer de saída e posteriormente anexado ao corpo de Resposta antes que a resposta HTTP seja> retornada ao cliente.

Isso é conveniente, mas não consegui ecoar. O que estava prejudicando era um problema maior. Separação de conteúdo do comportamento. Se você é como eu, você está configurando um aplicativo de página única, onde esse código basicamente fica no index.php. Há html inicial que eu precisava carregar, então incluí-o nessa página. O que eu precisava fazer era criar uma separação mais limpa. Meu roteamento foi configurado corretamente e, portanto, quando as pessoas GET ‘/’ Slim_Views (veja Develop Rel.) Retorna um modelo renderizado de html e js para mim. Brilhante!

Agora eu tenho todas as ferramentas do Slim à disposição e meu código é muito mais limpo, separado, gerenciável e mais compatível com os protocolos http. Eu acho que é para isso que são os frameworks. 🙂

NOTA: Eu não estou dizendo que tudo isso foi o que acabou no seu final, mas pensei que a pergunta e sua configuração pareciam muito semelhantes. Isso pode ajudar outro novo cara que vagueia por esse mesmo caminho.

Usando o Slim 3, estou usando esse formato:

 get('/{id}', function ($request, $response, $args) { $id = $request->getAttribute('id'); return $response->withJSON( ['id' => $id], 200, JSON_UNESCAPED_UNICODE ); }); 

A pedido “/ 123”, o resultado JSON com:

 { id: "123" } 

Mais informações, leia aqui .

[UPDATE] Adicionou segunda e terceira param para withJSON . O segundo é o código de status HTTP e o terceiro é opções de codificação Json (melhor para caracteres especiais e outros, por exemplo: imprima “ã” corretamente)

você pode estender magro com uma function de saída que a saída depende da solicitação REST chamada:

 class mySlim extends Slim\Slim { function outputArray($data) { switch($this->request->headers->get('Accept')) { case 'application/json': default: $this->response->headers->set('Content-Type', 'application/json'); echo json_encode($data); } } } $app = new mySlim(); 

e use-o assim:

 $app->get('/test/', function() use ($app) { $data = array(1,2,3,4); $app->outputArray($data); }); 

Uma vez que todos complicaram suas respostas com funções e aulas, vou lançar essa resposta simplificada. O \ Slim \ Http \ Response pode fazê-lo para você assim:

 $app = new \Slim\Slim(); $app->get('/something', function () use ($app) { $response = $app->response(); $response['Content-Type'] = 'application/json'; $response->status(200); $response->body(json_encode(['data' => []])); }); $app->run(); 

Como você provavelmente apenas retornará dados JSON, pode ser uma boa idéia fazer um middleware apropriado, veja http://www.sitepoint.com/best-practices-rest-api-scratch-introduction/ .

Eu acho que o Slim também fornece um object de middleware que faz isso automaticamente para que os usuários dessa estrutura não precisem escrever json_decode e codificar em todas as solicitações, é chamado de object Slim_Middleware_ContentType .

 $app->response()->('application/json'); $app->add(new Slim_Middleware_ContentType()); 

ele faz a decodificação para você. a decodificação funciona bem. Mas, para codificação, a última publicação é excelente.

Obrigado, Dharani

Eu sinto sua dor. Eu queria fazer uma function reutilizável, então fiz um arquivo de ajudantes e incluí isso:

 function toJSON($app, $content) { $response = $app->response; $response['Content-Type'] = 'application/json'; $response->body( json_encode($content) ); }; 

E então eu usei assim:

 $app->get('/v1/users/:id', function($id) use ($app) { //instantiate SMM data model $model = new user_model($site); //get all docs, or one, depending on if query contains a page ID $doc = $model->get(array()); //if the object contains main -- we don't need the outer data. toJSON($app, $doc); }); 

Edit: Eu acho que seria muito bom se já houvesse funções como esta incorporadas no object de resposta para os populares tipos de mímicos

 function _die($array){ echo json_encode($array); exit; } $result = mysql_query("SELECT * FROM table"); while($row = mysql_fetch_assoc($result)){ $array[] = $row; } _die($array); 

Por que não $response->write(json_encode($dataAry)); em vez de echo json_encode($dataAry); ?

Minha correção foi adicionar “sair”; No final da impressão de json, meu servidor de desenvolvimento não se importava, mas meu servidor ao vivo não provocaria o evento final do json. Não precisava adicionar headers ou usar json_encode.

// saída JSON em slim3

$ app-> get (‘/ users’, function ($ request, $ response, $ args) {

 require 'db_connect.php'; $stmt = $pdo->query("SELECT * FROM users"); $result=$stmt->fetchAll(PDO::FETCH_ASSOC); if ($stmt->rowCount() > 0) { return $response->withStatus(200) ->withHeader('Content-Type', 'application/json') ->write(json_encode($result)); } else{ $result = array( "status" => "false", "message" => "Result not found" ); return $response->withStatus(200) ->withHeader('Content-Type', 'application/json') ->write(json_encode($result)); } 

});

Use Slim JSON API https://coderwall.com/p/otcphg/create-a-json-restfull-api-using-slim-framework . Você pode lidar com a saída JSON com ele.

Eu uso slim-jsonAPI para minha API para habilitar a resposta JSON. O código Init parece algo assim:

 view(new \JsonApiView()); $app->add(new \JsonApiMiddleware()); } $app->group('/api', 'APIRequests', function () use ($app) { require ('api/areas.php'); }); 

Uma rota seria algo assim:

 get('/areas/:id', function ($id) use ($app) { $app->render(200, Area::find($id)); }); 

Eu realmente gosto do nível de abstração usando middleware e agrupamento de rotas, facilitando a aplicação de diferentes tipos de resposta para diferentes áreas do aplicativo.

[ANTES]: Content-Type text / html; charset = UTF-8

Não está funcionando com SOAPUI JSON 🙁

 $this->get('get_all', function ($req, $res, $args) { $um = new UserModel(); return $res ->withHeader('Content-Type', 'application/json') ->getBody() ->write( json_encode( $um->get_all() ) ); }); 

[APÓS]: Content-Type application / json; charset = utf-8

Trabalhando com SOAPUI JSON;)

 $this->get('get_all', function ($req, $res, $args) { $um = new UserModel(); return $res ->withHeader('Content-type', 'application/json;charset=utf-8') ->withJson($um->get_all()); 

Você pode usar no slim3, o método personalizado do object Slim’s Response com json ($ data, $ status, $ encodingOptions)

 $app->get('/hello/{name}', function ($request, $response, $args) { $data['msg']='Hello '.$request->getAttribute('name'); $newResponse = $response->withJson($data); }); 

Para mais informações, leia aqui.

header (“Content-Type: application / json”); echo json_encode ($ data);