HTTP POST request Class
Ik was op zoek naar een class om een POST request te versturen, die makkelijk aan te passen is. Maar ik kon er nergens een vinden, dus moest zelf aan de slag ;) Nu ben ik wel zo aardig om deze nu dan ook met jullie te delen, zodat jullie ook mee kunnen genieten van mijn script-kunsten... :D Ik heb hem zo gemaakt, dat hij makkelijk is aan te passen en uit te breiden. Daarom wordt er soms ook een beetje omslachtig gewerkt, zoals eerst een array maken, en daarna van die array een string. Een array is later (als je zelf iets wilt veranderen) makkelijker aan te passen. Alle commentaar is natuurlijk welkom, ik wil de classe zelf ook zo perfect mogelijk hebben ;) Veel plezier ermee! De versie 2 van deze classe is hier te vinden: http://www.phphulp.nl/php/scripts/4/1415
[b]De class:[/b]
[code]
<?php
class httpRequest {
/////
// Met deze class kan je een HTTP POST request versturen naar een url
/////
// De variabelen
// De host, uri en poort waarnaar gepost moet worden
private $strUrl; // Zonder 'http://'
private $strHost;
private $strUri;
private $intPoort;
// De headers die meegegeven worden, als array en als string
private $arrHeader;
private $strHeader;
// De argumenten die meegegeven worden, als array, als string en als int (lengte van string)
// Allemaal al geëncodeerd (met urlencode)
private $arrArgumenten;
private $strArgumenten;
private $intArgumenten;
// De variabele die de pointer van fsockopen bevat
private $resFilePointer;
// De response die tergugekregen wordt
private $strResponse;
private $strResponseHeader;
private $strResponseBody;
/////
// De publieke functies
// De functie die wordt aangeroepen aan het begin van de class
public function __construct($strUrl, $arrArgumenten=array(), $intPoort=80) {
// Verwerk de url en sla het op
$this->verwerkUrl($strUrl);
// Verwerk de argumenten en sla ze op
$this->verwerkArgumenten($arrArgumenten);
// Verwerk de poort en sla hem op
$this->verwerkPoort($intPoort);
// Maak de headers
$this->maakArrHeader();
$this->maakStrHeader();
return true;
}
// De functie die wordt aangeroepen aan het einde van de class
public function __destruct() {
// Sluit de verbinding als die nog bestaat
if ($this->resFilePointer) {
fclose($this->resFilePointer);
}
return true;
}
// De functie die de verbinding opent en de variabelen verzent
public function verzendRequest() {
// Probeer de verbinding te maken en de variabelen te verzenden
try {
// De 30 aan het einde geeft aan dat er maximaal 30 seconden geprobeerd wordt om een verbinding te maken
$this->resFilePointer = fsockopen($this->strHost, $this->intPoort, $intErrNummer, $strErrBericht, 30);
if (!$this->resFilePointer) {
throw new Exception ($intErrNummer.": ".$strErrBericht);
}
if (fputs($this->resFilePointer, $this->strHeader) === false) {
throw new Exception ("Kan de header niet verzenden");
}
if (fputs($this->resFilePointer, $this->strArgumenten) === false) {
throw new Exception ("Kan de argumenten niet verzenden");
}
return true;
}
// Als het niet gelukt is...
catch (Exception $e) {
$this->errorHandler("Fout tijdens het verzenden van de request (".$e->getMessage().")");
}
return false;
}
// De functie die de response ophaalt en teruggeeft
public function response ($booInclHeaders=false) {
// Haal de response op, als die nog niet is opgehaald
if (empty($this->strResponse)) {
$strResponse = "";
while (!feof($this->resFilePointer)) {
$strResponse .= fread($this->resFilePointer, 4096);
}
// Sla de response op als private variabele
$this->strResponse = $strResponse;
// Verwerk de response
list($strResponseHeader, $strResponseBody) = explode("\r\n\r\n", $strResponse, 2);
// En sla het op als private variabele
$this->strResponseHeader = $strResponseHeader;
$this->strResponseBody = $strResponseBody;
}
// Return de waarde
if ($booInclHeaders) {
return $this->strResponse;
}
else {
return $this->strResponseBody;
}
}
/////
// De privé-functies
// De functie die de url verwerkt en opslaat
private function verwerkUrl($strUrl) {
// verwijder het 'http://' van de url
if (substr($strUrl, 0, 7) == "http://") {
$strUrl = substr($strUrl, 7);
}
// Haal de host en de uri op uit de url
list($strHost, $strUri) = explode("/", $strUrl, 2);
// Voeg een slash toe voor de uri
$strUri = "/".$strUri;
// Sla de gevonden url, host en uri op als private variabelen
$this->strUrl = $strUrl;
$this->strHost = $strHost;
$this->strUri = $strUri;
return true;
}
// De functie die de argumenten verwerkt en opslaat
private function verwerkArgumenten($arrArgumenten) {
// Url encode de waardes van de argumenten
// NIET DE NAMEN VAN DE VARIABELEN!!!
$arrArgumentenEncoded = array();
foreach ($arrArgumenten as $strVarNaam => $strVarWaarde) {
$arrArgumentenEncoded[$strVarNaam] = urlencode($strVarWaarde);
}
// Van array naar string
$strArgumentenEncoded = "";
foreach ($arrArgumentenEncoded as $strVarNaam => $strVarWaardeEncoded) {
$strArgumentenEncoded .= "&".$strVarNaam."=".$strVarWaardeEncoded;
}
// Haal de eerste ampersand (&) weg
$strArgumentenEncoded = substr($strArgumentenEncoded, 1);
// Van string naar int (hoeveel karakters)
$intArgumentenEncoded = strlen($strArgumentenEncoded);
// Sla de gevonden variabelen opo als private variabelen
$this->arrArgumenten = $arrArgumentenEncoded;
$this->strArgumenten = $strArgumentenEncoded;
$this->intArgumenten = $intArgumentenEncoded;
return true;
}
// De functie die de poort controleerd en opslaat als het klopt
private function verwerkPoort($intPoort) {
// Controleer of het een getal is
if (is_numeric($intPoort)) {
// Controleer of het tussen de 0 en 65535 ligt
if ($intPoort >= 0 && $intPoort <= 65535) {
// Controleer of het geen comma-getal is
if ((float)$intPoort-(int)$intPoort == 0) {
// Poort klopt, sla op als private variabele
$this->intPoort = (int)$intPoort;
return true;
}
else {
$this->errorHandler("Poort kan geen komma-getal zijn");
}
}
else {
$this->errorHandler("Poort ligt niet tussen de 0 (nul) en 65535.");
}
$this->errorHandler("Poort is geen getal.");
}
return false;
}
// De functie die de header array vult
private function maakArrHeader($arrExtraHeader=array()) {
$arrHeader = array (
// Vertel dat we een POST request gaan doen en naar welke uri
"POST ".$this->strUri." HTTP/1.1",
// Vertel welk content type het is
'Content-Type' => "application/x-www-form-urlencoded",
// Vertel hoelang de string met variabelen is
'Content-Length' => $this->intArgumenten,
// Vertel dat aan het einde de verbinding verbroken moet worden
'Connection' => "Close"
);
// Voeg de extra headers toe
// Niet via array_merge, omdat die bij dubbele keys de oude overschrijft
foreach ($arrExtraHeader as $varNaam => $strWaarde) {
if ($varNaam == "" || is_int($varNaam)) {
$arrHeader[] = $strWaarde;
}
else {
$arrHeader[$varNaam] = $strWaarde;
}
}
// Sla de headers op als private variabele
$this->arrHeader = $arrHeader;
return true;
}
// De functie de de header array omzet in een string
private function maakStrHeader($arrHeader=array()) {
// Als er niks is meegegeven, gebruik dan $this->arrHeader
if (empty($arrHeader)) {
$arrHeader = $this->arrHeader;
}
// Voeg de waardes samen met een '\r\n' ertussen.
// Bij een numerieke key, de key niet weergeven. Anders ': ' ertussen.
$strHeader = "";
foreach ($arrHeader as $varNaam => $strValue) {
if (is_int($varNaam)) {
$strHeader .= $strValue;
}
else {
$strHeader .= $varNaam.": ".$strValue;
}
$strHeader .= "\r\n";
}
// Voeg aan het einde een extra '\r\n' toe
$strHeader .= "\r\n";
// Sla de header string op als private variabele
$this->strHeader = $strHeader;
return true;
}
// De functie die de foutafhandeling regelt
private function errorHandler ($strErrBericht) {
die ("<strong>httpRequest Error:</strong> ".$strErrBericht);
return false;
}
}
?>
[/code]
[b]Voorbeeld hoe te gebruiken:[/b]
[code]
<?php
// Je begint bij het begin: maak een object aan
$httpRequest = new httpRequest ("http://www.jouwdomein.nl/script.php", array("var1" => "waarde 1", "var2" => "waarde 2"), 80);
// Hierbij is het eerste argument de url waarnaar de request verstuurd moet worden.
// (het maakt niet uit of je er 'http://' voor gebruikt).
// Als tweede argument geef je een array met de variabelen die meegestuurd moeten worden. Je hoeft geen variabelen mee te geven.
// Als laatste kan je de poort instellen. Standaard is dit poort 80.
// Hierna verzend je de request:
$httpRequest->verzendRequest();
// Tot slot haal je de response op
$response = $httpRequest->response(true);
// Als argument geef je op of je de headers van de response wel (true) of niet (false) wilt ophalen.
// Standaard is dit false.
?>
[/code]
Reacties
0