CURL get请求没有没有响应

本文解决了使用CURL发送请求时遇到的URL编码问题。通过调整URL中参数的编码方式,确保了请求能够正确地被服务器解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<span style="font-size: 32px;">CURL,请求没有响应.这个是一开始代码></span>
$url=urlencode("http://query.yahooapis.com/v1/public/yql?q=select id,Rate from yahoo.finance.xchange where pair in ("CNYJPY")&env=store://datatables.org/alltableswithkeys&format=json");

        $ch = curl_init(); 
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $res = curl_exec($ch); 

        print_r(curl_getinfo($ch));
        curl_close($ch);
CURL这个是修改后代码.

$url = "http://query.yahooapis.com/v1/public/yql?q=";
$url .= urlencode("select id,Rate from yahoo.finance.xchange where pair in ('CNYJPY')");
$url .= "&env=";
$url .= urlencode("store://datatables.org/alltableswithkeys");
$url .= "&format=";
$url .= urlencode("json");
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res=curl_exec($ch);
curl_close($ch);
这个是个人心得,主要原因是url的编码问题,带参数不能一起编码,要给参数分开编码,这样浏览器就不会认识URL.



转载于:https://my.oschina.net/u/3291736/blog/843859

<think>嗯,用户想在PHP中使用cURL获取HTTP响应头。让我仔细想想该怎么解决这个问题。首先,我需要回忆一下PHP中cURL的基本用法。用户提到的几个引用里提到了curl_getinfo()函数,还有设置CURLOPT_HEADER选项,这应该和获取头信息有关。 首先,我记得使用cURL发送请求的基本步骤是初始化curl_init(),设置各种选项curl_setopt(),然后执行curl_exec(),最后关闭curl_close()。那如何获取响应头呢?根据引用[2]和[3],可能需要设置CURLOPT_HEADER为true,这样curl_exec()会返回响应头和响应体。但这样的话,响应头和响应体会混在一起,需要手动分割开。或者有没有其他方法? 另外,引用[1]和[5]提到curl_getinfo()可以获取请求头的信息,但可能不是响应头。而引用[3]指出curl_getinfo($ch, CURLINFO_HEADER_OUT)用来获取请求头的数据,但用户需要的是响应头。所以可能需要不同的方法。 正确的方法应该是设置CURLOPT_HEADER为true,这样响应头会被包含在curl_exec()的结果中。然后,通过CURLINFO_HEADER_SIZE获取头的大小,再用substr分割头和体。比如: curl_setopt($ch, CURLOPT_HEADER, true); $response = curl_exec($ch); $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE); $header = substr($response, 0, $header_size); $body = substr($response, $header_size); 这样就能分开头和体了。但用户可能需要处理多个重定向的情况,这时候响应头可能包含多个头信息,需要进一步解析。比如用explode("\r\n\r\n", $header)来分割每个头。 另外,引用[5]中提到了设置CURLOPT_SSL_VERIFYHOST为false,这可能与HTTPS请求有关,但为了安全最好不这么做,除非测试环境。 还有,用户可能想单独获取响应头而不包括在输出中,这时候需要设置CURLOPT_HEADERFUNCTION回调函数。这样可以逐行处理头信息,保存到一个变量中。这种方法适合处理大量头信息的情况,避免内存问题。 所以,总结两种方法:一种是直接获取整个响应再分割,另一种是用回调函数逐行收集头信息。用户可以根据需要选择哪种方法。需要注意,当有重定向时,第一种方法可能会得到多个头,需要处理;而第二种方法可能更方便收集每个头。 最后,确保代码示例正确,比如设置CURLOPT_RETURNTRANSFER为true,以便正确获取响应内容。同时,处理错误情况,检查curl_exec是否返回false,处理错误信息。</think>在PHP中使用cURL获取HTTP响应头可通过以下两种方法实现,具体步骤如下: --- ### 方法一:通过`CURLOPT_HEADER`直接获取(简单直接) ```php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://example.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, true); // 启用响应头输出 $response = curl_exec($ch); // 分离响应头和响应体 $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE); $headers = substr($response, 0, $header_size); $body = substr($response, $header_size); curl_close($ch); // 输出响应头 echo $headers; ``` - **关键点**:设置`CURLOPT_HEADER`为`true`时,响应头会包含在`curl_exec()`的返回值中,通过`CURLINFO_HEADER_SIZE`分割头和体[^2][^3]。 --- ### 方法二:通过`CURLOPT_HEADERFUNCTION`回调(逐行处理) ```php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://example.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $headers = []; curl_setopt($ch, CURLOPT_HEADERFUNCTION, function($curl, $header_line) use (&$headers) { $headers[] = trim($header_line); // 逐行存储响应头 return strlen($header_line); }); $body = curl_exec($ch); curl_close($ch); // 输出响应头数组 print_r($headers); ``` - **优势**:避免手动分割,尤其适用于需要精细解析或存在重定向的场景[^5]。 --- ### 扩展说明 1. **重定向处理**:若目标URL发生重定向,响应头可能包含多组头信息,需通过`explode("\r\n\r\n", $headers)`分割后处理。 2. **SSL验证**:对HTTPS请求可添加`curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false)`(仅测试环境使用)[^5]。 3. **请求头获取**:通过`curl_getinfo($ch, CURLINFO_HEADER_OUT)`可获取发送的请求头。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值