Zpracování POST požadavku s daty JSON

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Dismember
Člen | 50
+
0
-

ahoj,

vytvářím si pro jednu aplikaci komunikaci s android aplikací, která mi bude data posílat ve formátu json pomocí POST požadavku.

Základní testování provádím pomocí http://restify.io/

Vytvořil jsem si takovou třídu:

<?php
public function actionAppobj() {
        $this->httpRequest = $this->context->getService('httpRequest');
        $this->httpResponse = $this->context->getService('httpResponse');


        if ($this->httpRequest->isMethod('POST')) {
            $json = json_decode($this->httpRequest->getPost());

            print_r($json['status']);

            if ($json['status'] == "Pokus") {
                $this->httpResponse->setCode(Nette\Http\Response::S302_FOUND);
                echo '{"status":"ok"}';
            } else {
                $this->httpResponse->setCode(Nette\Http\Response::S200_OK);

            }

        } elseif ($this->httpRequest->isMethod('GET')) {
            $this->httpResponse->setCode(Nette\Http\Response::S403_FORBIDDEN);
            echo '{"status":"This is NOT ok! Give me POST, please!"}';
        }
    }
?>

Nyní jsem ve stavu, že pokud na tuto třídu pošlu GET požadavek, tak mi to pošle S403_FORBIDDEN a zobrazí zprávu {„status“:„This is NOT ok! Give me POST, please!“} , takže rozpoznání GET vs. POST funguje :-)

A ten dřívější IF by měl chytat zprávu, kterou jsem se pokoušel posílat v těle pomocí toto nástroje Restify:
{„status“:„Pokus“}

To se jaksi neděje a pokaždé mi to pošle zpátky 200 OK

Jakým způsobem mohu tedy přečíst POST data v těle požadavku? Co tady mám špatně?

Díky za pomoc!

David Matějka
Moderator | 6445
+
0
-

mel by ses k tomu dostat pomoci $httpRequest->getRawBody()

Ale zvaz pouziti nejakyho existujiciho rozsireni na restful, treba drahak/restful

Dismember
Člen | 50
+
0
-

Díky za nakopnutí – vyřešeno :-)

Všiml jsem si, že ta funkce getRawBody() je v Nette až od verze 2.2.0, zatímco já používám nějakou 2.1.x …

Upravil jsem svůj kód následovně:

<?php
if ($this->httpRequest->isMethod('POST')) {
            $json = json_decode((string)file_get_contents('php://input'), true);

            //print_r($json['status']);

            if ($json['status'] == "Pokus") {
                $this->httpResponse->setCode(Nette\Http\Response::S302_FOUND);
                echo '{"status":"ok"}';

            } else {
                $this->httpResponse->setCode(Nette\Http\Response::S200_OK);

            }
?>

A toto již funguje :-)

Ještě bych se zeptal tak trochu hloupě – co by mi přineslo použití již existujícího restful rozšíření, pokud potřebuji pouze příjmout data, ta zapsat do databáze a odeslat odpověd? Má v tomto případě cenu o tom uvažovat?

Editoval Dismember (30. 6. 2014 13:36)