php - type - slim withaddedheader
Salidas Slim JSON (17)
Estoy utilizando el marco Slim con PHP para crear una API RESTful para mi aplicación. Sin embargo, asumí que el marco tendría alguna forma de crear salidas JSON más fáciles en lugar de solo exit($jsonEncodedVariable);
.
¿Me falta algo en el marco, o necesito usar json_encode()
... exit($json)
... para cada método?
Todos los datos se sacan de la base de datos my MySQL y luego se colocan en una matriz JSON dependiendo de la solicitud REST.
Por ejemplo, si se solicitara /api/posts/all
, saldría exit()
una matriz JSON de todas las publicaciones, cada una de las cuales tiene un valor para su propia clave, "value" : key
.
Mi pregunta es, ¿existe una manera fácil, utilizando el marco delgado, para el código JSON de exit()
en lugar de salir como texto sin formato?
¿Por qué no usar el objeto de respuesta de Slim? (también ... ¿por qué salir?)
$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)
Permítanme comenzar diciendo que todavía me considero un noob, así que si estoy cometiendo errores, corríjame para que pueda aprender. Pero, estaba jugando con un problema / pregunta similar y pensé que podría agregar 2 centavos y archivar un poco más de discusión al respecto. Cuanta más información haya sobre Slim on Stack, mejor.
Básicamente estaba jugando con la misma cosa y noté que estabas usando exit ; Al principio, estaba usando exit también porque echo incluía un montón de HTML y estaba destruyendo lo que se estaba devolviendo a mi llamada AJAX. Cuando usé exit, cortó el HTML de forma limpia pero luego el objeto de respuesta Slim no estaba cambiando los encabezados de respuesta como lo definí (vea el código anterior).
Me di cuenta de que no era así como Slim estaba diseñado para funcionar. Usa el eco, no la salida. NOTA - Slim Doc:
Cada vez que se hace eco de () el contenido desde una devolución de llamada de la ruta, el contenido de echo () se captura en un búfer de salida y luego se agrega al cuerpo de Respuesta antes de que la respuesta HTTP se devuelva al cliente.
Eso es conveniente, pero no pude hacer eco. Lo que estaba arruinando era un problema más grande. Separación del contenido del comportamiento. Si eres como yo, estás configurando una aplicación de una sola página donde este código básicamente se encuentra en index.php. Hay un html inicial que necesitaba cargar, así que lo incluí en esa página. Lo que tenía que hacer era crear una separación más limpia. Mi enrutamiento se configuró correctamente y, por lo tanto, cuando la gente GET ''/'' Slim_Views (ver Desarrollo Rel.) Devuelve una plantilla renderizada de html y js para mí. ¡Brillante!
Ahora tengo todas las herramientas de Slim a disposición y mi código es mucho más limpio, separado, manejable y más compatible con los protocolos http. Supongo que para eso son los marcos. :-)
NOTA: No estoy diciendo que todo esto es lo que sucedió en su final, pero pensé que la pregunta y su configuración parecían muy similares. Podría ayudar a otro chico nuevo que divaga por el mismo camino.
Así es como lo hago en la versión slim 2.
$app->response->headers->set("Content-Type", ''application/json'');
return $app->response->write(json_encode([
''status'' => true,
''message'' => ''Your message''
]));
Creo que Slim también proporciona un objeto de middleware que hace esto automáticamente para que los usuarios de ese marco no tengan que escribir json_decode y codificar en cada solicitud, se llama el objeto Slim_Middleware_ContentType
.
$app->response()->(''application/json'');
$app->add(new Slim_Middleware_ContentType());
hace la decodificación por ti. La decodificación funciona muy bien. Pero para codificar el último mensaje es genial.
Gracias, Dharani
Dado que todos han complicado sus respuestas con funciones y clases, incluiré esta respuesta simplificada. El / Slim / Http / Response puede hacerlo por ti de esta manera:
$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 es muy probable que solo esté devolviendo datos JSON, puede ser una buena idea crear un middleware adecuado, consulte http://www.sitepoint.com/best-practices-rest-api-scratch-introduction/ .
Mi solución fue agregar "salir"; al final de la impresión de json, a mi servidor dev no le importó, pero mi servidor en vivo no activaría el evento final de json. No necesité agregar encabezados o usar json_encode.
Puede usar en slim3, el método personalizado del objeto de respuesta de Slim con Json ($ data, $ status, $ encodingOptions)
$app->get(''/hello/{name}'', function ($request, $response, $args) {
$data[''msg'']=''Hello ''.$request->getAttribute(''name'');
$newResponse = $response->withJson($data);
});
Para más información lea aquí.
Siento tu dolor. Quería hacer una función reutilizable, así que hice un archivo de ayudantes e incluí esto:
function toJSON($app, $content) {
$response = $app->response;
$response[''Content-Type''] = ''application/json'';
$response->body( json_encode($content) );
};
Y luego lo usé así:
$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: Creo que sería muy bueno si ya existieran funciones como esta integradas en el objeto de respuesta para los tipos de mime populares
Usando Slim 3, estoy usando este formato:
<?php
$app = new /Slim/App();
$app->get(''/{id}'', function ($request, $response, $args) {
$id = $request->getAttribute(''id'');
return $response->withJSON(
[''id'' => $id],
200,
JSON_UNESCAPED_UNICODE
);
});
A petición "/ 123", resulta JSON con:
{
id: "123"
}
Más informaciones leer aquí .
[ACTUALIZACIÓN] Agregado segundo y tercer withJSON
a withJSON
. El segundo es el código de estado HTTP y el tercero son las opciones de codificación Json (las mejores para caracteres especiales y otros, por ejemplo: imprimir "ã" correctamente)
Uso https://github.com/entomb/slim-json-api para mi API escrita en Slim 2 para habilitar la respuesta JSON. El código de inicio se ve algo como esto:
function APIRequests () {
$app = /Slim/Slim::getInstance();
$app->view(new /JsonApiView());
$app->add(new /JsonApiMiddleware());
}
$app->group(''/api'', ''APIRequests'', function () use ($app) {
$app->get(''/areas/:id'', function ($id) use ($app) {
$app->render(200, Area::find($id));
});
});
Me gusta mucho el nivel de abstracción mediante middleware y agrupación de rutas, lo que facilita la aplicación de diferentes tipos de respuesta a diferentes áreas de la aplicación.
Utilice Slim JSON API https://coderwall.com/p/otcphg/create-a-json-restfull-api-using-slim-framework . Puede manejar la salida JSON con él.
[ANTES]: Content-Type text / html; conjunto de caracteres = UTF-8
No funciona con 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()
)
);
});
[DESPUÉS]: Aplicación de tipo de contenido / json; charset = utf-8
Trabajando con 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());
encabezado ("Content-Type: application / json"); echo json_encode ($ data);
por qué no $response->write(json_encode($dataAry));
en lugar de echo json_encode($dataAry);
?
se puede extender slim con una función de salida cuya salida depende de la solicitud de REST:
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();
y úsalo así:
$app->get(''/test/'', function() use ($app) {
$data = array(1,2,3,4);
$app->outputArray($data);
});
//JSON output in 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));
}
});
function _die($array){
echo json_encode($array);
exit;
}
$result = mysql_query("SELECT * FROM table");
while($row = mysql_fetch_assoc($result)){
$array[] = $row;
}
_die($array);
header("Content-Type: application/json");
echo json_encode($result);
exit;
Sugerencia: uso de The Slim PHP Framework para desarrollar API REST