REST w php

Przy okazji pisania prostej aplikacji komunikacyjnej, natknąłem się na problem obsługi REST w php. Szczerze mówiąc, nie udało mi się znaleźć dobrej biblioteki, która mogłaby obsługiwać poprawnie wszystkie sposoby komunikacji.Framework Symfony w wersji 1.4 nie obsługuje komunikacji w standardzie REST (pluginów nie sprawdzałem). Zend posiada bibliotekę Zend_Rest 1, chociaż jej instalacja jest dosyć skomplikowana. Próba podpięcia skończyła się na tym, że należało podpiąć również przynajmniej 5 innych modułów. I tak okazało się, że musi być wcześniej określony schemat przesyłania parametrów (czy to się da jakoś zmienić – nie sprawdzałem). Na końcu wpadła mi w ręce RestClient.php 2 i wydawała się najlepszym rozwiązaniem.

Generalnie biblioteka to jedynie nakładka na cURL, ale czym więcej jest w istocie REST? Jedyny problem, jaki posiada RestClient.php, to niepoprawnie obsługiwany problem nagłówka Continue 3. Podczas przesyłania przy pomocy POST, HTTP 1.1 doklejony zostaje dodatkowy nagłówek, którego powyższa biblioteka nie potrafi poprawnie parsować. Wprowadziłem na szybko poprawkę, która w moim przypadku działa dobrze.

Wcześniej:

private function treatResponse($r) {

 if($r == null or strlen($r) < 1) {
   return;
 }

 $parts  = explode("\n\r",$r); // HTTP packets define that Headers end in a blank line (\n\r) where starts the body
 while(preg_match('@HTTP/1.[0-1] 100 (Continue) @',$parts[0]) or preg_match("@Moved@",$parts[0])) {
   // Continue header must be bypass
   for($i=1;$i<count($parts);$i++) {
     $parts[$i - 1] = trim($parts[$i]);
   }
   unset($parts[count($parts) - 1]);
 }
(...)

a po zmianach:

private function treatResponse($r) {

 if($r == null or strlen($r) < 1) {
   return;
 }

 $parts  = explode("\n\r",$r); // HTTP packets define that Headers end in a blank line (\n\r) where starts the body
 if(trim($parts[0])=='HTTP/1.1 100 (Continue)'){
   // Continue header must be bypass
   for($i=1;$i<count($parts);$i++) {
     $parts[$i - 1] = trim($parts[$i]);
   }
   unset($parts[count($parts) - 1]);
 }

Leave a Reply

Protected by WP Anti Spam