http-headers codigos - Obteniendo solo el encabezado de respuesta de HTTP POST usando curl




estado response (6)

Para cuerpos de respuesta larga (y varias otras situaciones similares), la solución que utilizo es siempre canalizar a less , por lo que

curl -i https://api.github.com/users | less

o

curl -s -D - https://api.github.com/users | less

hará el trabajo

Solo se pueden solicitar los encabezados utilizando HTTP HEAD, como opción -I en curl(1) .

$ curl -I /

Los cuerpos de respuesta HTML largos son una molestia para entrar en la línea de comandos, por lo que me gustaría obtener solo el encabezado como retroalimentación para mis solicitudes POST. Sin embargo, HEAD y POST son dos métodos diferentes.

¿Cómo consigo que curl muestre solo los encabezados de respuesta a una solicitud POST?


El siguiente comando muestra información adicional

curl -X POST http://httpbin.org/post -vvv > /dev/null

Puede pedir al servidor que envíe solo HEAD, en lugar de una respuesta completa

curl -X HEAD -I http://httpbin.org/

Note: Algunos servidores web configurados / programados incorrectamente pueden responder de forma diferente a la publicación porque es una solicitud HEAD no POST. Pero funciona la mayor parte del tiempo.


Las otras respuestas requieren que se descargue el cuerpo de la respuesta. Pero hay una manera de hacer una solicitud POST que solo obtendrá el encabezado:

curl -s -I -X POST http://www.google.com

Un -I por sí solo realiza una solicitud HEAD que puede ser anulada por -X POST para realizar una solicitud POST (o cualquier otra) y aún así solo obtener los datos del encabezado.



-D, --dump-header <file>
       Write the protocol headers to the specified file.

       This  option  is handy to use when you want to store the headers
       that a HTTP site sends to you. Cookies from  the  headers  could
       then  be  read  in  a  second  curl  invocation by using the -b,
       --cookie option! The -c, --cookie-jar option is however a better
       way to store cookies.

y

-S, --show-error
       When used with -s, --silent, it makes curl show an error message if it fails.

y

-L/--location
      (HTTP/HTTPS) If the server reports that the requested page has moved to a different location (indicated with a Location: header and a 3XX response
      code), this option will make curl redo the request on the new place. If used together with -i/--include or -I/--head, headers from  all  requested
      pages  will  be  shown.  When authentication is used, curl only sends its credentials to the initial host. If a redirect takes curl to a different
      host, it won’t be able to intercept the user+password. See also --location-trusted on how to change this. You can limit the amount of redirects to
      follow by using the --max-redirs option.

      When curl follows a redirect and the request is not a plain GET (for example POST or PUT), it will do the following request with a GET if the HTTP
      response was 301, 302, or 303. If the response code was any other 3xx code, curl will re-send the following  request  using  the  same  unmodified
      method.

de la página del manual. asi que

curl -sSL -D - www.acooke.org -o /dev/null

sigue las redirecciones, vuelca los encabezados a la salida estándar y envía los datos a / dev / null (eso es un GET, no un POST, pero puede hacer lo mismo con un POST; simplemente agregue cualquier opción que ya esté usando para datos de POSTing)

note la - después de la -D que indica que el "archivo" de salida es stdout.


Devolver encabezados de respuesta con un parámetro de referencia:

<?php
$data=array('device_token'=>'5641c5b10751c49c07ceb4',
            'content'=>'测试测试test'
           );
$rtn=curl_to_host('POST', 'http://test.com/send_by_device_token', array(), $data, $resp_headers);
echo $rtn;
var_export($resp_headers);

function curl_to_host($method, $url, $headers, $data, &$resp_headers)
         {$ch=curl_init($url);
          curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $GLOBALS['POST_TO_HOST.LINE_TIMEOUT']?$GLOBALS['POST_TO_HOST.LINE_TIMEOUT']:5);
          curl_setopt($ch, CURLOPT_TIMEOUT, $GLOBALS['POST_TO_HOST.TOTAL_TIMEOUT']?$GLOBALS['POST_TO_HOST.TOTAL_TIMEOUT']:20);
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
          curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
          curl_setopt($ch, CURLOPT_HEADER, 1);

          if ($method=='POST')
             {curl_setopt($ch, CURLOPT_POST, true);
              curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
             }
          foreach ($headers as $k=>$v)
                  {$headers[$k]=str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', $k)))).': '.$v;
                  }
          curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
          $rtn=curl_exec($ch);
          curl_close($ch);

          $rtn=explode("\r\n\r\nHTTP/", $rtn, 2);    //to deal with "HTTP/1.1 100 Continue\r\n\r\nHTTP/1.1 200 OK...\r\n\r\n..." header
          $rtn=(count($rtn)>1 ? 'HTTP/' : '').array_pop($rtn);
          list($str_resp_headers, $rtn)=explode("\r\n\r\n", $rtn, 2);

          $str_resp_headers=explode("\r\n", $str_resp_headers);
          array_shift($str_resp_headers);    //get rid of "HTTP/1.1 200 OK"
          $resp_headers=array();
          foreach ($str_resp_headers as $k=>$v)
                  {$v=explode(': ', $v, 2);
                   $resp_headers[$v[0]]=$v[1];
                  }

          return $rtn;
         }
?>




post curl http-headers