Slim – Как отправить ответ с заголовком Content-Type: application / json?

У меня есть этот простой 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 является неизменным и как таковой он должен быть возвращен или переназначен, если вы хотите вернуть его после в то время как.

Solutions Collecting From Web of "Slim – Как отправить ответ с заголовком Content-Type: application / json?"

Итак, вместо этого:

 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 .