Récemment, nous avons écrit de nombreux programmes pour l'accès à distance HTTP. Nous sommes principalement en contact avec la classe WebHttpRequest dans la bibliothèque de classes .NET et l'objet commun Microsoft.XMLHTTP. Avec ces classes pratiques, nous pouvons simuler le Web via C#, Les clients ASP et Javascript accèdent à d'autres pages Web. Mais aujourd'hui, je voulais utiliser PHP pour implémenter une fonction similaire, mais je n'ai pas trouvé la direction pendant un moment, j'ai donc dû « avoir assez de nourriture et de vêtements » par moi-même.
À l'heure actuelle, il n'existe pas de classe similaire à HttpRequest en PHP. Cependant, j'ai trouvé une telle page de classe HttpRequest dans la documentation officielle en ligne, mais elle mentionne seulement que cette fonction ne peut exister que dans la version CVS. Malheureusement...
À implémenter
.L'accès HTTP n'est rien de plus que l'envoi d'une requête à l'aide de Socket, puis la lecture des informations de retour. J'ai donc écrit une classe HttpRequest en utilisant Socket. Bien sûr, elle peut également être implémentée en utilisant la fonction fsockopen(), mais la différence entre les deux n'est pas très grande. Le code spécifique est dans la pièce jointe.
<?php
/**
* Réseau : objet de requête HTTP
* Auteur : Li HouYu (Karajan Lee), Shanghai, Chine.
*/
classe HttpRequest{
var $sHostAdd;
var $sUri;
var $iPort;
var $sRequestHeader;
var $sRéponse;
fonction HttpRequest($sUrl){
$sPatternUrlPart = '/http://([az-.0-9]+)(:(d+)){0,1}(.*)/i';
$arMatchUrlPart = tableau();
preg_match($sPatternUrlPart, $sUrl, $arMatchUrlPart);
$this->sHostAdd = gethostbyname($arMatchUrlPart[1]);
si (vide ($arMatchUrlPart[4])){
$this->sUri = '/';
}autre{
$this->sUri = $arMatchUrlPart[4];
}
si (vide ($arMatchUrlPart[3])){
$this->iPort = 80 ;
}autre{
$this->iPort = $arMatchUrlPart[3];
}
$this->addRequestHeader('Hôte : '.$arMatchUrlPart[1]);
$this->addRequestHeader('Connexion : Fermer');
}
fonction addRequestHeader($sHeader){
$this->sRequestHeader .= trim($sHeader)."rn";
}
fonction sendRequest ($sMethod = 'GET', $sPostData = ''){
$sRequest = $sMethod." ".$this->sUri." HTTP/1.1rn";
$sRequest .= $this->sRequestHeader;
si ($sMethod == 'POST'){
$sRequest .= "Type de contenu : application/x-www-form-urlencodedrn" ;
$sRequest .= "Content-Length : ".strlen($sPostData)."rn";
$sRequest .= "rn";
$sRequest .= $sPostData."rn";
}
$sRequest .= "rn";
$sockHttp = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
si ($chaussetteHttp){
die('socket_create() a échoué !');
}
$resSockHttp = socket_connect($sockHttp, $this->sHostAdd, $this->iPort);
si ($resSockHttp){
die('socket_connect() a échoué !');
}
socket_write($sockHttp, $sRequest, strlen($sRequest));
$this->sRéponse = '';
tandis que ($sRead = socket_read($sockHttp, 4096)){
$this->sResponse .= $sRead;
}
socket_close ($ sockHttp);
}
fonction getResponse(){
return $this->sResponse ;
}
fonction getResponseBody(){
$sPatternSeperate = '/rnrn/';
$arMatchResponsePart = preg_split($sPatternSeperate, $this->sResponse, 2);
renvoie $arMatchResponsePart[1] ;
}
fonction getResponseHead(){
$sPatternSeperate = '/rnrn/';
$arMatchResponsePart = preg_split($sPatternSeperate, $this->sResponse, 2);
renvoie $arMatchResponsePart[0] ;
}
}
?>