RestClient – RESTful klient využívající Curl, umožňující i multipart požadavky

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

Ahoj všem,

připravil jsem implementaci RESTful klienta využívající Curl pro Nette, připravil jsem i Addon page, je to prozatím draft.

https://componette.org/search/?…

Již mám vše napsané, ale ještě kód testuji, tak prozatím není přiložen. Bude dnes nebo nejpozději zítra.

Co na to říkáte?

Cifro
Člen | 245
+
0
-

Nice :) A dá sa pomocou RestClienta nastaviť, že ak spojenie sa nenadviaže napr. do 1s tak to vyhodí chybu, že server alebo zdroj neni dostupný? Pri fsockopen() to je piatý parameter. Do cUrl sa nevyznám, tak preto sa pýtam.

mkoubik
Člen | 728
+
0
-

Musí být metody post, get atd. statické? Jeden řádek navíc a jeden prázdný objekt v paměti nikoho nezabije. Pokud by to ještě mělo nějaký pěkný interface tak to zjednoduší případné rozšíření, nebo úplnou výměnu implementace.

// edit: typo

Editoval mkoubik (8. 3. 2011 13:20)

Trunda
Člen | 26
+
0
-

A dá sa pomocou RestClienta nastaviť, že ak spojenie sa nenadviaže napr. do 1s tak to vyhodí chybu, že server alebo zdroj neni dostupný? Pri fsockopen() to je piatý parameter. Do cUrl sa nevyznám, tak preto sa pýtam.

Jj to jde, podporuje to sám o sobě ten RestClient, je dost cest jak toho dosáhnout.

Třeba Hookem:

<?php
use Thereto\RestClient\RetClient;

RestClient::addBeforeExecutionProc(function(\Thereto\RestClient\Curl\Curl $curl) {
   // Celkový timeout
   $curl->timeout = 5;
   // Timeout na připojení
   $curl->connecttimeout = 3;
});
?>

a nebo použít nízkoúrovňové API

<?php
use Thereto\RestClient\Request;

$request = new Request(array('url' => 'google.com', 'method' => 'GET', 'timeout' => 5, 'openTimeout' => 3))
?>

a nebo Resource (asi nejrozumnější)

<?php
use Thereto\RestClient\Resource;

$resource = new Resource('http://example.com', array('timeout' => 5));
// Požadavek na example.com
$resource->get();

// požadavek na example.com/posts
$resource['posts']->get();

// POST na example.com/post/id/10/comments s plain/text daty (Super Clanek!)
$resource['post']['id/10']['comments']->post('Super clanek!', array('content-type' => 'txt'));
?>

Ve všech případech to vyhodí výjimku Thereto\RestClient\RequestTimeouted, v případě, že vytiká timeout nebo timetou pro připojení (dle nastavení).

Musí být metody post, get atd. statické? Jeden řádek navíc a jeden prázdný objekt v paměti nikoho nezabije.

Ta statická třída RestClient to jen obaluje (řekněme helper) když chceš objekty můžeš použít jiný „helper“ Resource:

<?php
use Thereto\RestClient\Resource;

$resource = new Resource('http://example.com');
// Požadavek na example.com
$resource->get();

// požadavek na example.com/posts
$resource['posts']->get();

// POST na example.com/post/id/10/comments s plain/text daty (Super Clanek!)
$resource['post']['id/10']['comments']->post('Super clanek!', array('content-type' => 'txt'));
?>

a nebo přímo použít Thereto\RestClient\Request objekt.

Pokud by to ještě mělo nějaký pěkný interface tak to zjednoduší případné rozšíření, nebo úplnou výměnu implementace.

Ano fasádu jsem zvažoval minimálně u Curlu, kde by se to dalo vyměnit například za fsockopen, je to prozatím takový „draft“ vycházející z Ruby implementace. Takže se to určitě ještě někam posune.

//Edit: doplnění

Editoval Trunda (8. 3. 2011 13:41)

Patrik Votoček
Člen | 2221
+
0
-

Jen sem to rychle prolétnul a:

  • hezčí by bylo používat instance
  • array('content-type' => 'json', 'accept' => 'xml'));array('content-type' => RestClient::MIME_JSON, 'accept' => RestClient::MIME_XML)); nebo tak něco
Trunda
Člen | 26
+
0
-

Patrik Votoček napsal(a):

Jen sem to rychle prolétnul a:

  • hezčí by bylo používat instance
  • array('content-type' => 'json', 'accept' => 'xml'));array('content-type' => RestClient::MIME_JSON, 'accept' => RestClient::MIME_XML)); nebo tak něco

Ono je těch mime typů poměrně hodně, ale daly by asi vytipovat „TOP-USED“. A tohle použití také trochu plyne z Thereto/Mime, ale to bude vidět, až tam dám kód.

Patrik Votoček
Člen | 2221
+
0
-

mě se hlavně nelíbilo to „json“ když to má být:

application/json
application/x-javascript
text/javascript
text/x-javascript
text/x-json

a pro „TOP-USED“ se to hodí

Trunda
Člen | 26
+
0
-

Pro json by to mělo být prostě jen application/json, možná tedy i text\x-json, ale v rfc 4627 je application/json

U Content-Type musí být nastavena právě jedna hodnota, u Accept pak může být více, což je podporováno:

array('content-type' => 'application/json',
      'accept' => array(
	  'application/json',
          'application/x-javascript',
          //...
      ));

A tady máš asi pravdu, že pro ty často užívané by bylo fajn definovat konstanty, ale jen pro Accept.

Patrik Votoček
Člen | 2221
+
0
-

Trunda napsal(a):

Pro json by to mělo být prostě jen application/json, možná tedy i text\x-json, ale v rfc 4627 je application/json

jasny ale ty jsi tam měl prostě json místo application/json

… ale jen pro Accept.

WTF? Why? je přece jedno jestli píšu 'content-type' => RestClient::MIME_JSON nebo

array('accept' => array(
	RestClient::MIME_JSON,
	RestClient::MIME_XML,
	//...
));
Trunda
Člen | 26
+
0
-

Aha, jsme se špatně pochopili.

Původně jsem myslel nadefinovat konstanty pro Accept, protože tato hlavička může mít hodnot a tak by se daly definovat běžné kombinace. Něco jako:

class RestClient {
	public static $MIME_JSON_LIKE = array(
            'application/json',
            'application/x-javascript',
	);
}

… no prostě jsme se nepochopili.

měl prostě json místo application/json

No to je feature třídy Thereto\Mime\Types, která má metodu typesFor($filename), kde podle koncovky pozná a nabídne seznam Mime typů, takže když použiješ v Accept jen například json, nebo jpg, doplní se to samo na application/json respektive image/jpeg.

To ale nemění nic na tom, že ty konstanty by se daly definovat.

// edit: doplnění

Editoval Trunda (8. 3. 2011 21:16)

Patrik Votoček
Člen | 2221
+
0
-

Trunda napsal(a):

No to je feature třídy Thereto\Mime\Types, která má metodu typesFor($filename), kde podle koncovky pozná a nabídne seznam Mime typů, takže když použiješ v Accept jen například json, nebo jpg, doplní se to samo na application/json respektive image/jpeg.

na první pohled cool na druhý kua hodně magické… :-D

Trunda
Člen | 26
+
0
-

No magie to je :), myslíš vyhodit?

Lábus
Bronze Partner | 19
+
0
-

jak to vypada s REST klientem? rad bych ho vyzkousel

Stopka
Člen | 4
+
0
-

Docela by se mi to teď hodilo. Bude v nejblišší době REST klient k dispozici? Nebo nespokytl by mi jej někdo? Rád bych jej vyzkoušel a případně i rovnou použil v jednom projektu.