T&R splet blog o spletnih storitvah. Razgaljamo tehnologijo!

reference spletnih strani
21st April

PHP GET Request – Basic Authorization – Chunk data

Če želite brez uporabe zunanjih knjižnic (kot naprimer PHP cURL) kreirati GET request oz. zahtevo, ki zna opraviti z Basic Authorization je fsockopen odlična zadeva.

Basic Authorization:
Okno, ki se pojavi, ko želimo dostopati do spletne strani, ki je zaščitena z geslom ter uporabniškim imenom.

GET metoda (headerji):

PHP:
  1. $out  = "GET /blog/feed/ HTTP/1.1\r\n";
  2. $out .= "Host: www.trsplet.com\r\n";
  3. $out .= "Connection: Close\r\n";
  4. $out .= "Authorization: Basic ".base64_encode(username:password)."\r\n";
  5. $out .= "\r\n\r\n";

Uporabite absolutno pot do spletne strani preko katere želite dostopati s PHP-jem. Nastavite Host (če uporabljate IP, potem ne pišite www. spredaj), nato pa še uporabite base64_encode za uporabniško ime ter geslo, ki sta potrebna za dostop do spletne strani. Zakaj base64? Ker morata biti geslo ter uporabniško ime poslana v base64 kodiranem tekstu:

Before transmission, the username and password are encoded as a sequence of base-64 characters. For example, the user name Aladdin and password open sesame would be combined as Aladdin:open sesame – which is equivalent to QWxhZGRpbjpvcGVuIHNlc2FtZQ== when encoded in base-64.

Sedaj odprimo povezavo in poglejmo, če je komunikacija med PHP-jem ter strežnikom uspešna:

PHP:
  1. $errno = null;
  2. $errstr = null;
  3.    
  4. if (!$conex = @fsockopen('www.trsplet.com', '80', $errno, $errstr, 10)) {
  5.     echo $errno;
  6.     echo "\n$errstr";
  7.     exit;
  8. }

Opis ter kode napak, ki jih fsockopen vrne. Ko zadeva deluje pošljemo headerje (nastavitve), ki smo jih zapisali zgoraj v PHP out spremenljivko ter nato preberemo vse podatke (vsebino), ki nam jih je strežnik vrnil:

PHP:
  1. fwrite($conex, $out);
  2. $data = '';
  3.  
  4. // Get data
  5. while (!feof($conex)) {
  6.     $data .= fgets($conex, 512);
  7. }
  8.  
  9. // Get response headers
  10. $headers = explode("\r\n", trim(substr($data, 0, strpos($data, "\r\n\r\n") + 4)));

V našem primeru dobimo od strežnika nazaj sledeče podatke (malce skrčeno, za lažji pregled):

HTML:
  1. HTTP/1.1 200 OK
  2. Date: Mon, 21 Apr 2008 08:03:50 GMT
  3. Server: Apache
  4. X-Powered-By: PHP/5.2.3
  5. X-Pingback: http://trsplet.com/blog/xmlrpc.php
  6. Last-Modified: Sun, 20 Apr 2008 19:14:45 GMT
  7. ETag: "3ee78cc4133141ec2464445a405bb9dd"
  8. Connection: close
  9. Transfer-Encoding: chunked
  10. Content-Type: text/xml; charset=UTF-8
  11.  
  12. 23d1
  13. <?xml version="1.0" encoding="UTF-8"?>
  14.     <title>.: TRSplet - internetne storitve .:</title>
  15.          <atom:link href="http://www.trsplet.com/blog/feed/" rel="self" type="application/rss+xml" />
  16.     <link>http://trsplet.com/blog</link>
  17.     <description>O spletu, življenju in RT le tega</description>

Torej v odgovoru prejmemo tudi header nastavitve, zato jih je potrebno prebrati ter odstraniti iz same vsebine:

PHP:
  1. $headers = explode("\r\n", trim(substr($data, 0, strpos($data, "\r\n\r\n") + 4)));

Header tabela po zgornji operaciji:

PHP:
  1. (
  2.     [0] => HTTP/1.1 200 OK
  3.     [1] => Date: Mon, 21 Apr 2008 07:52:15 GMT
  4.     [2] => Server: Apache/1.3.33 (Darwin) mod_ssl/2.8.24 OpenSSL/0.9.7l
  5.     [3] => Cache-Control: no-cache
  6.     [4] => WWW-Authenticate: Basic realm="WebNative"
  7.     [5] => Cache-Control: max-age=60
  8.     [6] => Expires: Mon, 21 Apr 2008 07:53:15 GMT
  9.     [7] => Connection: close
  10.     [8] => Transfer-Encoding: chunked
  11.     [9] => Content-Type: text/html
  12. )

Vsaka vrstica se konča z \r\n, na koncu pa zaključimo header nastavitve z \r\n\r\n. Ko imamo vse headerje prebrane pregledamo ali nam je strežnik vrnil chunk data - vsebino, ki potrebuje dodatno obdelavo:

PHP:
  1. if (in_array("Transfer-Encoding: chunked", $headers)) {
  2.     $data = decodeChunkedData(substr($data, strpos($data, "\r\n\r\n") + 4));
  3. }

Vsa komunikacija je bila opravljena, dobili smo podatke in jih v primeru chunk data - vsebine pravilno prebrali, sedaj še zapremo povezavo in obdelamo podatke, ki smo jih dobili:

PHP:
  1. fclose($conex);
  2.  
  3. // sedaj obdelaj data spremenljivko, ki vsebuje vsebino spletne strani, ki smo jo klicali

Datoteke:

Dodatne informacije:

Deli s skupnostjo:

  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks

Podobni članki:

  1. PHP POST Request – brez uporabe cURL knjižnice
  2. Hitri vnos/uvoz podatkov v MySQL preko LOAD DATA INFILE
  3. Pretvorba PHP MySQL aplikacije v PHP MS SQL aplikacijo (apache, php, mdb2, mysql => iis, php, mdb2, mssql)
  4. Preprosta skripta – kreiranje Excel datoteke iz PHP tabele/array
  5. Uporabni HTML meta tagi – PHP header
  6. PHP – Kreiranje Excel datoteke – Pisanje v Excel datoteko – PHP – xls
  7. PHP setlocale (seznam držav in kode le-teh)
  8. Stalni UTF-8 problemi – utf8 mysql php – čšž šumniki težave – iskanje znaki – mysql like
  9. PHP – pošiljanje emaila – epošte – sending email – HTML Mime Mail
  10. Šumniki – UTF-8 – Težave – PHP & MySQL

Dodaj komentar