Zpracování POST požadavku s daty JSON
- Dismember
- Člen | 50
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
mel by ses k tomu dostat pomoci
$httpRequest->getRawBody()
Ale zvaz pouziti nejakyho existujiciho rozsireni na restful, treba drahak/restful
- Dismember
- Člen | 50
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)