Heim  >  Artikel  >  Backend-Entwicklung  >  Holen Sie sich die Kapselung der Post-Request-Methode in PHP

Holen Sie sich die Kapselung der Post-Request-Methode in PHP

WBOY
WBOYOriginal
2016-08-08 09:28:491572Durchsuche
<span style="font-size:18px;">网站上的商城可以搭建ecshop实现,微信端的微商城也可以开发wap版商城,然后通过链接链到微信菜单上,这样实现起来就不需要远程调用数据了,但登陆上有个问题,在微信上进入微商城在用户体验上当然不需要再登陆只需要有微信openid即可。所以有个考虑是在微信端开发微商城,所以的数据是取自网站商城的,这时需要远程请求数据。
有了ihttp_request()方法后,可通过此方法获取远程数据</span>
<span style="font-size:18px;"></span><pre name="code" class="php">function ihttp_request($url, $post = '', $extra = array(), $timeout = 60) {
	$urlset = parse_url($url);
	if(empty($urlset['path'])) {
		$urlset['path'] = '/';
	}
	if(!empty($urlset['query'])) {
		$urlset['query'] = "?{$urlset['query']}";
	}
	if(empty($urlset['port'])) {
		$urlset['port'] = $urlset['scheme'] == 'https' ? '443' : '80';
	}

	if(function_exists('curl_init') && function_exists('curl_exec')) {
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $urlset['scheme']. '://' .$urlset['host'].($urlset['port'] == '80' ? '' : ':'.$urlset['port']).$urlset['path'].$urlset['query']);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_HEADER, 1);
		if($post) {
			curl_setopt($ch, CURLOPT_POST, 1);
			if (is_array($post)) {
				$post = http_build_query($post);
			}
			curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
		}
		curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
		curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1');
		if (!empty($extra) && is_array($extra)) {
			$headers = array();
			foreach ($extra as $opt => $value) {
				if (strexists($opt, 'CURLOPT_')) {
					curl_setopt($ch, constant($opt), $value);
				} elseif (is_numeric($opt)) {
					curl_setopt($ch, $opt, $value);
				} else {
					$headers[] = "{$opt}: {$value}";
				}
			}
			if(!empty($headers)) {
				curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
			}
		}
		$data = curl_exec($ch);
		$status = curl_getinfo($ch);
		$errno = curl_errno($ch);
		$error = curl_error($ch);
		
		curl_close($ch);
		if($errno || empty($data)) {
			return error(1, $error);
		} else {
				
			return ihttp_response_parse($data);
		}
	}
	$method = empty($post) ? 'GET' : 'POST';
	$fdata = "{$method} {$urlset['path']}{$urlset['query']} HTTP/1.1\r\n";
	$fdata .= "Host: {$urlset['host']}\r\n";
	if(function_exists('gzdecode')) {
		$fdata .= "Accept-Encoding: gzip, deflate\r\n";
	}
	$fdata .= "Connection: close\r\n";
	if (!empty($extra) && is_array($extra)) {
		foreach ($extra as $opt => $value) {
			if (!strexists($opt, 'CURLOPT_')) {
				$fdata .= "{$opt}: {$value}\r\n";
			}
		}
	}
	$body = '';
	if ($post) {
		if (is_array($post)) {
			$body = http_build_query($post);
		} else {
			$body = urlencode($post);
		}
		$fdata .= 'Content-Length: ' . strlen($body) . "\r\n\r\n{$body}";
	} else {
		$fdata .= "\r\n";
	}
	if($urlset['scheme'] == 'https') {
		$fp = fsockopen('ssl://' . $urlset['host'], $urlset['port'], $errno, $error);
	} else {
		$fp = fsockopen($urlset['host'], $urlset['port'], $errno, $error);
	}
	stream_set_blocking($fp, true);
	stream_set_timeout($fp, $timeout);
	if (!$fp) {
		return error(1, $error);
	} else {
		fwrite($fp, $fdata);
		$content = '';
		while (!feof($fp))
			$content .= fgets($fp, 512);
		fclose($fp);
		return ihttp_response_parse($content, true);
	}
}

function ihttp_response_parse($data, $chunked = false) {
	$rlt = array();
	$pos = strpos($data, "\r\n\r\n");
	$split1[0] = substr($data, 0, $pos);
	$split1[1] = substr($data, $pos + 4, strlen($data));
	
	$split2 = explode("\r\n", $split1[0], 2);
	preg_match('/^(\S+) (\S+) (\S+)$/', $split2[0], $matches);
	$rlt['code'] = $matches[2];
	$rlt['status'] = $matches[3];
	$rlt['responseline'] = $split2[0];
	$header = explode("\r\n", $split2[1]);
	$isgzip = false;
	$ischunk = false;
	foreach ($header as $v) {
		$row = explode(':', $v);
		$key = trim($row[0]);
		$value = trim($row[1]);
		if (is_array($rlt['headers'][$key])) {
			$rlt['headers'][$key][] = $value;
		} elseif (!empty($rlt['headers'][$key])) {
			$temp = $rlt['headers'][$key];
			unset($rlt['headers'][$key]);
			$rlt['headers'][$key][] = $temp;
			$rlt['headers'][$key][] = $value;
		} else {
			$rlt['headers'][$key] = $value;
		}
		if(!$isgzip && strtolower($key) == 'content-encoding' && strtolower($value) == 'gzip') {
			$isgzip = true;
		}
		if(!$ischunk && strtolower($key) == 'transfer-encoding' && strtolower($value) == 'chunked') {
			$ischunk = true;
		}
	}
	if($chunked && $ischunk) {
		$rlt['content'] = ihttp_response_parse_unchunk($split1[1]);
	} else {
		$rlt['content'] = $split1[1];
	}
	if($isgzip && function_exists('gzdecode')) {
		$rlt['content'] = gzdecode($rlt['content']);
	}

	$rlt['meta'] = $data;
	if($rlt['code'] == '100') {
		return ihttp_response_parse($rlt['content']);
	}
	return $rlt;
}

function ihttp_response_parse_unchunk($str = null) {
	if(!is_string($str) or strlen($str) < 1) {
		return false; 
	}
	$eol = "\r\n";
	$add = strlen($eol);
	$tmp = $str;
	$str = &#39;&#39;;
	do {
		$tmp = ltrim($tmp);
		$pos = strpos($tmp, $eol);
		if($pos === false) {
			return false;
		}
		$len = hexdec(substr($tmp, 0, $pos));
		if(!is_numeric($len) or $len < 0) {
			return false;
		}
		$str .= substr($tmp, ($pos + $add), $len);
		$tmp  = substr($tmp, ($len + $pos + $add));
		$check = trim($tmp);
	} while(!empty($check));
	unset($tmp);
	return $str;
}

$goods = array(
"api_version" =>"1.0",
"goods_id" => "4",
"ac" => " ac",
"act" => "search_goods_detail",
"return_data" => "json",
);
$url = "http://10.92.1.3/api . php"; //Hier ist der 10.92.1.2-Server, der api.php auf 1.3 aufruft, um seine Daten zu erhalten
$result = ihttp_request($url,$data);
var_dump($result);
Print Der Ausgabeinhalt ist:
array(6) {
["code"]=>
string(3) "200"
["status"]=>
string( 2) "OK"
["responseline"]=>
string(15) "HTTP/1.1 200 OK"
["headers"]=>
array(9) {
["Server"]=>
string(5) "nginx"
["Datum"]=>
string(19) "Fr, 06. März 2015 08"
[ "Content-Type"]=>
string(24) "text/html; charset=utf-8"
["Transfer-Encoding"]=>
string(7) "chunked"
["Connection"]=>
string(10) "keep-alive"
["Vary"]=>
string(15) "Accept-Encoding"
[ "X-Powered-By"]=>
string(10) "PHP/5.3.17"
["Cache-control"]=>
string(7) "private"
["Set-Cookie"]=> =>
string(47) "ECS[visit_times]=1; läuft ab=Sa, 05.03.2016 00"
}
}
["content"]=>
string(241) "{"result":success",msg":","info":{"data_info":[{"goods_id":1" ,"last_modify": "1423937979"}, {"goods_id": "2", "last_modify": "1425595831"}, {"goods_id": "3", "last_modify": "1423937959"}, {"goods_id" :"4", "last_modify": "1423942862"}],"counts": "4"}}"
["meta"]=>
string(625) "HTTP/1.1 200 OK
Server: nginx
Datum: Fr, 06. März 2015 08:03:41 GMT
Inhaltstyp: text/html; charset=utf-8
Übertragungskodierung: chunked
Verbindung: keep-alive
Vary: Accept- Encoding
X-Powered-By: PHP/5.3.17
Set-Cookie: ECS_ID=05fdcd0810e735bf2b3b3c8ddb5911d94e319b8b; path=/
Cache-control: private
Set-Cookie: ECS[visit_times]=1 ; Expires=Sa, 05.03.2016 00:03:41 GMT; path=/
Der gedruckte Inhalt ist sehr detailliert, sogar die Header-Informationen werden gedruckt, aber wir nur Wir müssen uns um den Inhalt im Inhalt kümmern. Es sind die Daten, die wir benötigen, um
["content"]=>
string(241) "{"result":"success","msg": "","info":{"data_info": [{"goods_id":1,last_modify:1423937979"},{"goods_id:2",last_modify:1425595831"},{ "goods_id": "3", "last_modify": "1423937959"},{"goods_id": "4", "last_modify": "1423942862"}],"counts": "4"}}"


Das Obige stellt die Kapselung der Get-Post-Request-Methode in PHP vor, einschließlich des relevanten Inhalts. Ich hoffe, dass es für Freunde hilfreich ist, die sich für PHP-Tutorials interessieren.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn