问题描述
我尝试从套接字请求中获取没有HTTP标头的结果,但是脚本返回整个HTTP标头,如下所示:
$api_pause = parse_url('http://server/api.php');
$requestArray_pause = array('user' => 'someuser','pass' => 'somepasse','source' => 'PAUSE','function' => 'field_info','field_name' => 'status','user_id'=> $user_id );
$sock_pause = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
socket_connect($sock_pause,$api_pause['host'],((isset($api_pause['port'])) ? $api_pause['port'] : 80));
if (!$sock_pause) {
throw new Exception('Connexion echouee!');
}
$request_pause = '';
if (!empty($requestArray_pause)) {
foreach ($requestArray_pause as $k_p => $v_p) {
if (is_array($v_p)) {
foreach($v_p as $v2_p) {
$request_pause .= urlencode($v_p).'[]='.urlencode($v2_p).'&';
}
}
else {
$request_pause .= urlencode($k_p).'='.urlencode($v_p).'&';
}
}
$request_pause = substr($request_pause,-1);
}
$data_pause = "POST ".$api_pause['path'].((!empty($api_pause['query'])) ? '?'.$api_pause['query'] : '')." HTTP/1.0\r\n"
."Host: ".$api_pause['host']."\r\n"
."Content-type: application/x-www-form-urlencoded\r\n"
."User-Agent: PHP\r\n"
."Content-length: ".strlen($request_pause)."\r\n"
."Connection: close\r\n\r\n"
.$request_pause."\r\n\r\n";
socket_send($sock_pause,$data_pause,strlen($data_pause),0);
$result_pause = '';
do {
$piece_pause = socket_read($sock_pause,1024);
$result_pause .= $piece_pause;
}
while($piece_pause != '');
socket_close($sock_pause);
echo $result_pause;
代码的结果是:
HTTP/1.1 200 OK
Date: Wed,16 Sep 2020 10:51:35 GMT
Server: Apache/2.2.15 (CentOS)
X-Powered-By: PHP/5.3.3
Cache-Control: no-cache,must-revalidate
Pragma: no-cache
Content-Length: 1
Connection: close
Content-Type: text/html; charset=utf-8
A
在我的情况下,我想仅获得此示例中没有标题信息的最后一个值“ A”。
解决方法
套接字将为您提供接收到的任何数据,无论它是什么协议。 因此,您必须自己处理所有HTTP标头。
HTTP标头通过两个换行符(空行)与正文分开。您可以只剪切两条空行之前的所有数据:
$body = preg_replace('/^.*?\r?\n\r?\n/s','',$result_pause);
如果要使用HTTP协议进行通信,请考虑使用例如cURL而不是普通套接字