http-post-request-class

Gesponsorde koppelingen

PHP script bestanden

  1. http-post-request-class

« Lees de omschrijving en reacties

De class:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
<?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;
    }
}

?>



Voorbeeld hoe te gebruiken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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.

?>

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.