2016-01-07 5 views
20

Ich habe diesen einfachen REST-API, getan in Schlank,Slim - So senden Sie eine Antwort mit dem Header "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(); 

ich aber nicht Browser mir Typen application/json Inhalt senden bekommen können, es sendet immer text/html? Was mache ich falsch?

EDIT:

Ok, nach zwei Stunden den Kopf gegen die Wand schlagen, ich auf diese Antwort gestolpert:

https://github.com/slimphp/Slim/issues/1535 (am unteren Rand einer Seite) , die erklärt, was passiert, erscheint, dass response Objekt ist unveränderlich und als solche muss es zurückgegeben oder neu zugewiesen werden, wenn Sie es nach while zurückgeben möchten.

+0

Haben Sie den HTTP-Antwort-Header "Content-Type" vor dem Senden der Antwort festgelegt? – Rao

+1

..wie Sie sehen können in meinem Code '$ response-> withHeader ('Content-Type', 'application/json');' – branquito

+0

Sollte 'return' nicht' echo' sein? – Darren

Antwort

21

Anstatt also diese:

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

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

wie folgt tun:

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

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

Und alles ist gut und gut.

8

Für V3 ist withJson() verfügbar.

So können Sie so etwas wie:

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

Hinweis: Achten Sie darauf, die $response zurück, weil, wenn Sie vergessen, noch die Antwort heraus kommen, aber es wird application/json nicht sein.

+0

Warum funktioniert die Verkettung nicht, während Sie sie auf separaten Zeilen haben? –

+0

@JomarSevillejo, ich müsste Ihren Code sehen, um einen Hinweis zu geben, aber wenn sie in separaten Zeilen sind, müssen Sie das Objekt nach diesen Zeilen zurückgeben. – conrad10781

+1

@ jomar-sevillejo Dies liegt daran, dass das Response-Objekt unveränderlich ist. Jedes Mal, wenn Sie eine Eigenschaft ändern wollen, erstellen Sie nur einen Klon mit dem neuen Wert für diese Eigenschaft. Daher funktioniert die Verkettung, und dies ist die letzte, die Sie an Slim zurückgeben müssen. – Gabriel

Verwandte Themen