Jednoduché api pomocí jsonResponse

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

Ahoj, tvořím api k jedné aplikaci. První verze by měla umět pouze načítat a ukládat data autorizovaným uživatelům. Zkoušel jsem několikrát zmiňovaného Draháka, ale nepodařilo se mi jej rozchodit, tudíž jsem zkusil udělat api přes json response, kde url vypadá:
http://localhost/mujprojekt/api/measurements/get/5/400/xml
kde api je modul, measurements – presenter, get – akce, a zbytek parametry..

public function actionGet($id, $measurand_id, $format) {
		if($id && $measurand_id && $format) {
			if ($format == "xml") {
				//todo xml
				return $this->response($this->measurmentModel->getByObjectAndMeasurand($id, $measurand_id));
			}
			else {
				return $this->response($this->measurmentModel->getByObjectAndMeasurand($id, $measurand_id));
			}
		}
		else {
			$this->noParams();
		}
	}
	// $this->measurmentModel->getByObjectAndMeasurand($id, $measurand_id) -> vraci pole

	private function response($data) {
		return $this->sendResponse(new \Nette\Application\Responses\JsonResponse($data, "application/json;charset=utf-8"));
	}

	private function noParams() {
		return $this->response(["code" => 400, "status" => "Invalid URL"]);
	}

Tahle implementace byla poměrně jednoduchá, ale měl bych k ní pár dotazů

  1. vím že se nejedná vůbec o rest, nýbrž o jenom response, ale i to je forma api ne?
  2. viděl někdo tuhle implementaci reálně požívat?
  3. lze na tomhle nějak udělat autorizaci? (aby stahovali jenom ti co mohou)
  4. lze udělat nějak POST request (nejlépe upload souboru)

Pokud je to uplný nesmysl a nemá cenu v téhle verzi dál pokračovat, poskytl by někdo zprovozněny Sample z Draháka? Děkuji.

Mysteria
Člen | 797
+
+1
-

Zkus se podívat na ublaboo/api-router, používám ho k plné spokojenosti.

Pavel Janda
Člen | 977
+
+1
-

@lukendo https://github.com/…uter-project :) Jednoduchý příklad použití

lukendo
Člen | 96
+
0
-

Mysteria napsal(a):

Zkus se podívat na ublaboo/api-router, používám ho k plné spokojenosti.

zkouším podle ukázky, ale hlásí mi to error [Semantical Error] The annotation "@ApiRoute" in class App\Presenters\ApiRouterPresenter was never imported. Did you maybe forget to add a "use" statement for this annotation? search

při vstupu na tuto url http://localhost/uplaboo/www/api/users/read/lukas
vše jsem snad nastavil správně..

lukendo
Člen | 96
+
0
-

Pavel Janda napsal(a):

@lukendo https://github.com/…uter-project :) Jednoduchý příklad použití

díky,

Editoval lukendo (29. 9. 2017 18:13)

lukendo
Člen | 96
+
0
-

lukendo napsal(a):

Pavel Janda napsal(a):

@lukendo https://github.com/…uter-project :) Jednoduchý příklad použití

díky ale nevím si moc rady.. tady v tom muzu rozchodit tu ukazku, tím že přidám ty presentery atd?

lukendo
Člen | 96
+
0
-

Podařilo se mi už odladit chyby, ale nějak nevím jaká má být správná url. Router mám podle ukázky, jsem si myslel že by to mělo být takhle – http://localhost/project-name/www/api-router/api/users/read/18 ale hází mi to 404

Editoval lukendo (1. 10. 2017 11:39)

Mysteria
Člen | 797
+
0
-

Jak máš definovanou anotaci na té metodě, která má danou URL obsluhovat?

lukendo
Člen | 96
+
0
-

Mysteria napsal(a):

Jak máš definovanou anotaci na té metodě, která má danou URL obsluhovat?

	/**
	 * @ApiRoute(
	 * 	"/api-router/api/users/<id>[/<limit>-<offset>]",
	 *	method="GET",
	 * )
	 */
	public function actionRead() {
		$this->sendJson(['John' => 'Doe']);
	}
Pavel Janda
Člen | 977
+
0
-

@lukendo Zkus si pls rozjet vhosta.. Nejsem si jist, jestli jsem přidal podporu takto zadané cesty.

lukendo
Člen | 96
+
0
-

Pavel Janda napsal(a):

@lukendo Zkus si pls rozjet vhosta.. Nejsem si jist, jestli jsem přidal podporu takto zadané cesty.

a muzu poprosit nějaký hint jak na to? :)

zkusil jsem do .hosts

<VirtualHost localhost:80>
    ServerAdmin localhost
    DocumentRoot "C:\xampp\htdocs"
    ServerName localhost
</VirtualHost>

ale pořád nic

Editoval lukendo (2. 10. 2017 19:37)

Pavel Janda
Člen | 977
+
0
-

Něco takového?

<VirtualHost *:80>
    DocumentRoot "C:\xampp\htdocs"
    ServerName foo.bar
    <Directory "C:\xampp\htdocs">
        Options Indexes FollowSymLinks # Includes ExecCGI
        AllowOverride All
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>
lukendo
Člen | 96
+
0
-

tak ani toto nepomohlo :D

Mysteria
Člen | 797
+
0
-

Pro přístup k routě /api-router/api/users/<id>[/<limit>-<offset>], musíš v prohlížeči zadat URL ve tvaru http://neco.neco/api-router/api/users/<id>.

Já mám třeba @ApiRoute("/user[/<id>]", parameters={"id"={"requirement":"\d+"}}) a pak je to dostupné na http://project.local/user/<id>.

lukendo
Člen | 96
+
0
-

Mysteria napsal(a):

Pro přístup k routě /api-router/api/users/<id>[/<limit>-<offset>], musíš v prohlížeči zadat URL ve tvaru http://neco.neco/api-router/api/users/<id>.

Já mám třeba @ApiRoute("/user[/<id>]", parameters={"id"={"requirement":"\d+"}}) a pak je to dostupné na http://project.local/user/<id>.

http://localhost/uplaboo/www/api-router/api/users/54 → zadávám tohle, to by mělo být v pořádku ne?

Mysteria
Člen | 797
+
0
-

To právě že ne, bez toho, aby jsi vytvořil VirtualHost jak ti psal kolega výše ti to nepůjde. To http://localhost/uplaboo/www musí být skryto za něčím jako mám já třeba to projekt.local.

lukendo
Člen | 96
+
0
-

tak v hosts mám:

<VirtualHost *:80>
    DocumentRoot "C:\xampp\htdocs"
    ServerName api.local
    <Directory "C:\xampp\htdocs">
        Options Indexes FollowSymLinks # Includes ExecCGI
        AllowOverride All
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>

url pak zadávám http://api.local/api-router/api/users/85

routa :

	/**
	 * @ApiRoute(
	 * 	"/api-router/api/users/<id>[/<limit>-<offset>]",
	 *	method="GET",
	 * )
	 */

soubor UsersPres je v app/ResourcesModule/presenters/

routa:

$router[] = new ApiRoute('/api-router/api/users[/<id>]', 'Resources:Users', [
			'parameters' => [
				'id' => ['requirement' => '\d+', 'default' => 10]
			],
			'priority' => 1
		]);

jestli je chyba v umistení UsersPres. tak se z toho asi zblázním :D

Pavel Janda
Člen | 977
+
0
-

@lukendo Ukaž ještě presenter. Mohl bys ten projekt nahrát na github?

lukendo
Člen | 96
+
0
-

Pavel Janda napsal(a):

@lukendo Ukaž ještě presenter. Mohl bys ten projekt nahrát na github?

https://github.com/…icha/uplaboo
mělo by to být „funkční“
Předem děkuji za pomoc se zprovozněním :)