2016-01-07 20 views
20

Mam ten prosty REST API, sporządzonej w Slim,Slim - Jak wysłać odpowiedź z nagłówkiem "Content-Type: application/json"?

<?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(); 

jednak nie mogę przeglądarka wysłać mi application/json typ zawartości, to zawsze wysyła text/html? Co robię źle?

EDIT:

Ok, po dwie godziny uderzanie głową o ścianę, ja natknęliśmy się na to odpowiedź:

https://github.com/slimphp/Slim/issues/1535 (na dole strony) który wyjaśnia, co się dzieje, wydaje się, że obiekt response jest niezmienny i jako taki musi zostać zwrócony lub przeniesiony, jeśli chcesz go zwrócić po podczas.

+0

Ustawiłeś nagłówek odpowiedzi 'Content-Type' przed wysłaniem odpowiedzi? – Rao

+1

... jak widzisz w moim kodzie '$ response-> withHeader ('Content-Type', 'application/json');' – branquito

+0

Czy 'return' nie powinien brzmieć' echo'? – Darren

Odpowiedz

21

Więc zamiast tego:

if($student) { 
      $response->withHeader('Content-Type', 'application/json'); 
      $response->write(json_encode($student)); 
      return $response; 

     } else { throw new PDOException('No records found');} 

Czy tak:

if($student) { 
    return $response->withStatus(200) 
     ->withHeader('Content-Type', 'application/json') 
     ->write(json_encode($student)); 

} else { throw new PDOException('No records found');} 

I wszystko jest dobrze i dobre.

8

Dla V3 dostępny jest withJson().

Więc można zrobić coś takiego:

return $response->withStatus(200) 
       ->withJson(array($request->getAttribute("route") 
       ->getArgument("someParameter"))); 

Uwaga: Upewnij się zwrócić $response ponieważ jeśli zapomnisz, odpowiedź będzie jeszcze wyjdzie, ale to nie będzie application/json.

+0

Dlaczego łańcuchy działające, mając je w osobnych liniach, nie są? –

+0

@JomarSevillejo, musiałbym zobaczyć twój kod, aby podać wskazówkę, ale jeśli są one w osobnych liniach, nadal będziesz musiał zwrócić obiekt po tych liniach. – conrad10781

+1

@ jomar-sevillejo Dzieje się tak dlatego, że obiekt Response jest niezmienny. Za każdym razem, gdy chcesz "zmodyfikować" jedną z jego właściwości, w rzeczywistości tworzysz klona z nową wartością dla tej właściwości. Dlatego łańcuchy działają, i to jest ostatnia, którą musisz powrócić do Slim. – Gabriel