Beste mensen,
op dit moment ben ik bezig met een klein hobby projectje waarbij ik een stukje joomla code wil laten communiceren met een door mijzelf gemaakte rest achtige service. Alles CRUD methoden gaan goed tot op het moment dat ik het volgende doe.
Ik heb een entiteit competitie en een entiteit game. Om een game in een competitie te plaatsen voer ik eerst een PUT request uit op mijn service voor de competitie. Waarna ik een POST er achter aan doe die de game toevoegt aan de aan de competitie.
Het probleem is nu dat op het moment dat ik de competitie resource aanspreek om te posten de php://input variabele niet wordt herschreven maar wordt aangevuld met gegevens van het tweede request. Dus in plaats van.
en
in twee losse 'requests' komt er dit uit de php://input
Ik vraag mij of dat dit normaal gedraag is en zo nee hoe ik dat voorkom. Op het moment dat er een request op de server binnen komt wordt er aan de hand van de url een bepaald resource object geinitializeerd. Dit object bevat methoden die overeenkomen met de http methodes ( put,post,delete,put,get). Omdat ik een aantal resources heb, heb ik een abstracte class gemaakt die een aantal functionaliteiten al in zich heeft zoals het uitlezen van de php://input.
Om de request te maken gebruik ik de volgende code:
Nadat ik van het request de headers heb gecontroleerd doe ik het volgende:
dit levert dus bij het maken van 2 requests vlak na elkaar een lange string in de body op die eigenlijk dus twee body's hadden moeten zijn . Nu is mijn idee dat dit komt omdat
op dit moment ben ik bezig met een klein hobby projectje waarbij ik een stukje joomla code wil laten communiceren met een door mijzelf gemaakte rest achtige service. Alles CRUD methoden gaan goed tot op het moment dat ik het volgende doe.
Ik heb een entiteit competitie en een entiteit game. Om een game in een competitie te plaatsen voer ik eerst een PUT request uit op mijn service voor de competitie. Waarna ik een POST er achter aan doe die de game toevoegt aan de aan de competitie.
Het probleem is nu dat op het moment dat ik de competitie resource aanspreek om te posten de php://input variabele niet wordt herschreven maar wordt aangevuld met gegevens van het tweede request. Dus in plaats van.
XML:
1
| <competitie>...</competitie> |
en
XML:
1
| <game></game> |
in twee losse 'requests' komt er dit uit de php://input
XML:
1
| <competitie></competitie><game></game> |
Ik vraag mij of dat dit normaal gedraag is en zo nee hoe ik dat voorkom. Op het moment dat er een request op de server binnen komt wordt er aan de hand van de url een bepaald resource object geinitializeerd. Dit object bevat methoden die overeenkomen met de http methodes ( put,post,delete,put,get). Omdat ik een aantal resources heb, heb ik een abstracte class gemaakt die een aantal functionaliteiten al in zich heeft zoals het uitlezen van de php://input.
Om de request te maken gebruik ik de volgende code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
| <? $eol = "\r\n"; $header = null; if(($method == "PUT")|| ($method== "DELETE")) { $headers = "POST ".$resourceIdentifier." HTTP/1.1".$eol. "Host: ".$url.$eol. "hm_method: ".$method.$eol. // custom header zodat ik niet afhankelijk ben van x-methods wat niet altijd werkt "hm_authentication: ".$this->configuration->getAuthenticationKey().$eol. "Content-Type: text/xml".$eol. "Content-Length: ".strlen($content).$eol. "Connection: Close".$eol.$eol. $content.$eol.$eol.$eol; }else{ $headers = $method." ".$resourceIdentifier." HTTP/1.1".$eol. "Host: ".$url.$eol. "hm_authentication: ".$this->configuration->getAuthenticationKey().$eol. "Content-Type: text/xml".$eol. "Content-Length: ".strlen($content).$eol. "Connection: Close".$eol. $content.$eol.$eol.$eol; } $host = str_replace("http://","",$url); $fp = fsockopen($host,80,$errno,$errstr); if($fp) { fputs($fp,$headers,strlen($headers)); $data = stream_get_contents($fp); fclose($fp); echo $data; if(strpos($data,"<?xml version=\"1.0\" encoding=\"UTF-8\"?>") === false) { return substr($data,strpos($data,$eol),strlen($data)); }else{ return substr($data,strpos($data,"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"),strlen($data)); } } ?> |
Nadat ik van het request de headers heb gecontroleerd doe ik het volgende:
PHP:
1
2
3
4
5
6
7
| $fp = fopen("php://input","r"); while (!feof($fp)) { $this->body .= fgets($fp,128); } fclose($fp); |
dit levert dus bij het maken van 2 requests vlak na elkaar een lange string in de body op die eigenlijk dus twee body's hadden moeten zijn . Nu is mijn idee dat dit komt omdat
- fsockopen een static verbinding maakt met de server
- of de connection toch niet op tijd gesloten wordt door fclose
[ Voor 0% gewijzigd door Webgnome op 21-12-2008 20:12 . Reden: HTTP versie aangepast. Maar lost nog niet het proleem op. ]