У меня есть этот простой REST api, сделанный в Slim,
<?php require '../vendor/autoload.php'; function getDB() { $dsn = 'sqlite:/home/branchito/personal-projects/slim3-REST/database.sqlite3'; $options = array( PDO::ATTR_PERSISTENT => true, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ); try { $dbh = new PDO($dsn); foreach ($options as $k => $v) $dbh->setAttribute($k, $v); return $dbh; } catch (PDOException $e) { $error = $e->getMessage(); } } $app = new \Slim\App(); $app->get('/', function($request, $response) { $response->write('Bienvenidos a Slim 3 API'); return $response; }); $app->get('/getScore/{id:\d+}', function($request, $response, $args) { try { $db = getDB(); $stmt = $db->prepare("SELECT * FROM students WHERE student_id = :id "); $stmt->bindParam(':id', $args['id'], PDO::PARAM_INT); $stmt->execute(); $student = $stmt->fetch(PDO::FETCH_OBJ); if($student) { $response->withHeader('Content-Type', 'application/json'); $response->write(json_encode($student)); } else { throw new PDOException('No records found');} } catch (PDOException $e) { $response->withStatus(404); $err = '{"error": {"text": "'.$e->getMessage().'"}}'; $response->write($err); } return $response; }); $app->run();
однако я не могу заставить браузер отправлять мне тип application/json
, он всегда отправляет text/html
? Что я делаю неправильно?
РЕДАКТИРОВАТЬ:
Хорошо, после двух часов удара головой к стене, я наткнулся на этот ответ:
https://github.com/slimphp/Slim/issues/1535 (внизу страницы), который объясняет, что происходит, появляется, что объект response
является неизменным и как таковой он должен быть возвращен или переназначен, если вы хотите вернуть его после в то время как.
Итак, вместо этого:
if($student) { $response->withHeader('Content-Type', 'application/json'); $response->write(json_encode($student)); return $response; } else { throw new PDOException('No records found');}
Сделайте так:
if($student) { return $response->withStatus(200) ->withHeader('Content-Type', 'application/json') ->write(json_encode($student)); } else { throw new PDOException('No records found');}
И все хорошо и хорошо.
Для V3 withJson()
.
Таким образом, вы можете сделать что-то вроде:
return $response->withStatus(200) ->withJson(array($request->getAttribute("route") ->getArgument("someParameter")));
Примечание. Убедитесь, что вы вернули $response
потому что, если вы забудете, ответ все равно будет выходить, но это не будет application/json
.