RestClient – RESTful klient využívající Curl, umožňující i multipart požadavky
- Trunda
- Člen | 26
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?
- Trunda
- Člen | 26
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
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
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
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
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
Trunda napsal(a):
Pro json by to mělo být prostě jen
application/json
, možná tedy itext\x-json
, ale v rfc 4627 jeapplication/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
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
Trunda napsal(a):
No to je feature třídy
Thereto\Mime\Types
, která má metodutypesFor($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 naapplication/json
respektiveimage/jpeg
.
na první pohled cool na druhý kua hodně magické… :-D