2009-08-04 11 views
9

Ich versuche, den Content-Type-Header für eine JSON-Antwort festzulegen, auf die mit einer AJAX GET-Anfrage zugegriffen wird. Ich habe Tutorials auf Blogs und in der Bäckerei verfolgt, bekomme aber immer 'text/html' von CakePHP zurück. Wie setze ich den Content-Type-Header richtig?Wie wird der korrekte Inhaltstyp für JSON in CakePHP zurückgegeben?

Hier ist mein Code im Moment:

public function admin_controller_actions_ajax() 
{ 
    Configure::write('debug', 0); 
    if ($this->RequestHandler->isGet()) { 
     $this->autoRender = FALSE; 

     $aco_id = $this->params['url']['aco_id']; 
     $aro_id = $this->params['url']['aro_id']; 

     assert('$aco_id != NULL && $aro_id != NULL && 
       is_numeric($aco_id) && is_numeric($aro_id)'); 

     $actions = $this->Resource->getActionsForController($aco_id, $aro_id); 

     assert('is_array($actions) && is_array($actions[0])'); 

     /* I made RequestHandler part of the $components property */ 
     $this->RequestHandler->setContent('json'); 
     $this->RequestHandler->respondAs('json'); /* I've tried 'json', 'JSON', 'application/json' but none of them work */ 

     $this->set('json_content', json_encode(array('response' => $actions[0]))); 
     $this->layout = NULL; 
     $this->render('/json/default'); 
    } 
} 


/* json/default.ctp */ 
<?php echo $json_content; ?> 

Jede Hilfe würde geschätzt.

Danke,

- Isaac

+1

Verwenden Sie Router :: parseExtensions() in Ihrer Datei routes.php? Wenn ja, müssen Sie "debug" in app/config/core.php auf 0 setzen, damit es mit dem richtigen Inhaltstyp antwortet. – dhofstet

+0

Nein, ich verwende Router :: parseExtensions() nicht, aber ich setze Debug in der Anfrage trotzdem auf 0. –

Antwort

0

Ich bin nicht sicher (und, um ehrlich zu sein, habe ich noch nie CakePHP verwendet), aber Sie können ein zweites Argument angeben, um versuchen wollen in der setContent Methode ..

diese ersetzen:

$this->RequestHandler->setContent('json') 

mit diesem:

$this->RequestHandler->setContent('json', 'text/x-json'); 

siehe this file für ein Beispiel ..

+0

Ich habe es gerade versucht (ich habe schon ähnliche Sekundärargumente versucht, aber ich dachte, ich würde es noch einmal versuchen) und es funktioniert nicht. Ich bekomme immer noch 'text/html' zurück. –

+0

Ich auch. Ich benutze das UND versuchen und erzwingen den Antworttyp mit: $ this-> RequestHandler-> respondAs ('json'); Keine Arbeit für mich. – zmonteca

6

Ich mache Ajax-Aufrufe JSON Inhalt in alle meine Projekte abzurufen und ich habe nie die meisten getan, was Sie hier machen. Das Ausmaß meiner Controller Code sieht dies so etwas wie:

public function do_something_ajaxy() { 
    Configure::write ('debug', 0); 
    $this->autoRender = false; 

    /** Business logic as required */ 

    echo json_encode ($whatever_should_be_encoded); 
} 

Ich mache meine Ajax über jQuery ruft so nehme ich an, dass könnte einen Unterschied machen, aber es würde mich überraschen. In diesem Fall scheint Ihr Problem im Handler zu liegen, nicht beim Anrufer. Ich würde empfehlen, Zeilen 17-23 zu entfernen und sie durch eine einfache echo json_encode (array('response' => $actions[0])) Anweisung zu ersetzen.

Sie testen auch für $this->RequestHandler->isGet(). Versuchen Sie stattdessen, $this->RequestHandler->isAjax() zu testen. Ich bin mir nicht sicher, ob Ajax-Aufrufe sowohl nach ihrem Typ als auch nach ihrer Methode erkannt werden.

+0

Ich habe das schon mal versucht - ich hatte nur 'json_encode zurückgeben' (und ich habe 'echo json_encode' auch versucht). Mir wurde im IRC-Kanal gesagt, dass dies eine schlechte Art sei, dies zu tun, und der "richtige Weg" ist es, eine Sichtweise zu verwenden. Ich war anderer Meinung, aber ich tat es trotzdem, um dem nachzukommen. Ich werde IsAjax testen, aber da mein Ajax-Aufruf eine Get-Anfrage ist, sollte IsGet auch funktionieren. Ich mache auch meine Ajax Anrufe mit jQuery. –

+0

Ich habe gerade Ihren Vorschlag ausprobiert (ich habe alles vereinfacht, um json_encode wiederzugeben und isAjax anstelle von isGet zu verwenden) und bekomme immer noch 'text/html' zurück. –

+1

Entschuldigung, Isaac. Ich habe vergessen, darauf zurückzukommen. Der Inhaltstyp sollte keine Rolle spielen, solange der Inhalt selbst JSON ist. Ich vermeide Ansichten für solche Sachen, weil es eine extra Datei ist, die im Wesentlichen nichts tut. Ich habe Probleme mit Unordnung. :-) –

1

ich auch dieses Problem nur gehabt haben, und löste es durch die Verwendung:

$this->RequestHandler->respondAs('text/x-json'); 

auch sicher, dass „debug“ in Ihrer Konfigurationsdatei auf weniger als 2 ansonsten der Header gesetzt wird nicht gesetzt .

0

Ich habe das gleiche Problem wie das ursprüngliche Plakat wurde, und was für mich gearbeitet wurde Rob Wilkerson Rat zu befolgen, sondern auch sicherstellen, dass ich wurde mit

jQuery.ajax() 

statt

jQuery.get() 

oder

jQuery.post() 

jQuery.ajax() können Sie den Datentyp ‚json‘ setzen, während die beiden anderen nicht tun scheint Ihnen erlauben, den Datentyp überhaupt einzustellen. Als ich den Datentyp in der AJAX-Anfrage auf 'json' gesetzt habe, hat alles so funktioniert, wie es sollte.

+2

Sie können tatsächlich einen Datentyp in '.post()' und '.get()' angeben, siehe die Dokumentation (Stand Dez 2011). http://api.jquery.com/jQuery.post/ http://api.jquery.com/jQuery.get/ –

6

Nach this und this lesen, habe ich die folgenden zurückzukehren "Content-Type: application/json":

Configure::write('debug', 0); 
$this->RequestHandler->respondAs('json'); 
$this->autoRender = false;    
echo json_encode($data); 

Mit $ .getJSON Methode des JQuery, bin ich noch immer

Resource interpreted as image but transferred with MIME type text/html. 

Aber zumindest meine Daten sind Parsing.

+0

Ich habe vor kurzem diese Methode in Cake 2.0 verwendet (obwohl diesen Code zu einer Funktion in verschoben AppController, so dass jeder Controller es ohne Wiederholung verwenden kann). Es scheint gut zu funktionieren und ermöglicht es jQuery (1.7), den Inhalt automatisch als JSON zu erkennen. –

Verwandte Themen