Maison >développement back-end >tutoriel php >Comment puis-je récupérer efficacement les en-têtes et le corps de la réponse dans une seule requête PHP cURL ?

Comment puis-je récupérer efficacement les en-têtes et le corps de la réponse dans une seule requête PHP cURL ?

DDD
DDDoriginal
2024-12-16 07:36:13382parcourir

How Can I Efficiently Retrieve Both Response Headers and Body in a Single PHP cURL Request?

Récupération des en-têtes et du corps de réponse dans une seule requête cURL PHP

La bibliothèque cURL de PHP offre la possibilité d'effectuer des requêtes HTTP, ce qui la rend polyvalente pour tâches de récupération de données et de communication. Cependant, un défi courant rencontré lors de l'utilisation de cURL est la nécessité de récupérer à la fois les en-têtes et le corps de la réponse en une seule requête.

Par défaut, définir CURLOPT_HEADER sur true renvoie les en-têtes et le corps combinés dans la réponse, ce qui nécessite davantage analyse pour extraire les composants individuels. Pour une approche plus efficace et sécurisée, une méthode alternative peut être utilisée :

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);

// Execute the request
$response = curl_exec($ch);

// Extract header and body
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);

Cette méthode sépare les en-têtes du corps à l'aide des informations CURLINFO_HEADER_SIZE. Notez que cette approche peut avoir des limites lorsqu'il s'agit de serveurs proxy ou de certains types de redirections. Envisagez d'utiliser la solution suivante pour une fiabilité accrue dans de tels cas :

function get_headers_body($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_NOBODY, true);

    // Execute the request and get headers only
    $headers = curl_exec($ch);

    // Close the original handle
    curl_close($ch);

    // Set the necessary header information to a new handle
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));

    foreach (explode("\n", $headers) as $header) {
        // Remove set-cookie headers
        if (stripos($header, 'set-cookie') !== false) {
            continue;
        }
        // Add it to the request
        curl_setopt($ch, CURLOPT_HTTPHEADER, array($header));
    }

    // Execute the request and get the body only
    $body = curl_exec($ch);

    // Close the handle
    curl_close($ch);

    return array(
        'headers' => $headers,
        'body' => $body
    );
}

Cette solution offre un meilleur contrôle sur le processus de récupération d'en-tête, garantissant des résultats plus fiables.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn