blog.Ring.idv.tw

跨網域請求(三) - Cross Domain Proxy

跨網域請求(三) - Cross Domain Proxy


這種跨網域技術的方式最大的優點在於~ 他只需要單方面的向你所想要請求的資源進行溝通即可~

也就是說,我們先前所曾介紹過的「跨網域請求(二) - Flash Plug-In」、「跨網域請求(一) - Cross-Domain Script Tag」都需要雙方遵循著某種條件才能達成進行溝通~

而最簡單的例子不外乎像是Flickr所提供的API~ 它就是採用「Cross-Domain Script Tag」來達成的~

不過利用「Cross Domain Proxy」最大的缺點就在於~ 你需要將所有請求的資源都交由這台「Proxy」委任地去幫你處理~ 這將會造成「IP」被對方的伺服器封鎖,或是負荷過載的情形發生~ 所以這時就需要「CSProxy」才能解決這些問題~ 這部份留待以後再介紹~

我們就直接來看一個簡單的「Corss Domain Proxy」的例子,此例子以「Google Translate」為例:

Translate.php

<?php
require_once "HttpClient.php";

if($_POST)
{
	$sentence = $_POST['input'];
	$uri = "http://translate.google.com/translate_t";
	$data = array('langpair' => 'en|zh-TW', 'h1' => 'en', 'ie' => 'UTF8', 'text' => $sentence);

	$request = new HttpClient();
	$request->setContent($data);
	$request->setUri($uri);
	$body = $request->doAction();
	
	$regex = '/<div id=result_box dir=\"ltr\">(.*)<\/div><\/td>/Us';
	preg_match($regex,$body,$match);
	echo $match[1];
}
?>

HttpClient.php

此程式參考HTTP POST from PHP, without cURL,您可以自行修改並擴充~ 當然也歡迎您再分享您的成果 ^^

<?php
/**
 * Date: 2008/04/17
 * Shen(http://blog.ring.idv.tw)
 */
class HttpClient
{
	private $uri;
	private $params;

	function __construct()
	{
		$this->params = array
		(
			'http' => array
			(
				'method' => 'POST',
				'content' => '',
			)
		);
	}
	public function setUri($uri)
	{
		$this->uri = $uri;
	}
	public function setContent($content)
	{
		$this->params['http']['content'] = http_build_query($content);
	}
	public function doAction()
	{
		$ctx = stream_context_create($this->params);
		$fp = @fopen($this->uri, 'rb', false, $ctx);
	
		if(!$fp)
			throw new Exception("Problem: $php_errormsg");
	
		$response = @stream_get_contents($fp);
		if ($response === false)
			throw new Exception("Problem: $php_errormsg");
	
		return $response;
	}
}
?>

2008-04-17 23:50:55

Leave a Comment

Copyright (C) Ching-Shen Chen. All rights reserved.

::: 搜尋 :::

::: 分類 :::

::: Ads :::

::: 最新文章 :::

::: 最新回應 :::

::: 訂閱 :::

Atom feed
Atom Comment