JSONP Post Proxy

时间:2013-04-03 20:03:40

标签: jquery ajax

我正在编写一个与Twitter API集成的相当基本的Web应用程序。我正在使用jQuery和AJAX请求身份验证令牌Twitter,但我违反了异步跨站点请求策略或其他任何策略。

我会使用JSONP,但Twitter API需要POST。我已经读过我应该使用一个itermediate代理。我不知道涉及什么,找不到任何资源?我可以用PHP编写。

任何人都可以解释一下代理页面是什么吗?

更新

在阅读下面接受的答案之后,我写了一个PHP代理脚本,这就是我想出的并开始工作:

    <?php

    class proxy {

        public $serviceURL;
        public $postString;
        public $headers;
        public $response;

        public function __construct($url) {  
            $this->serviceURL = $url;
            $this->postStringify($_POST);
        }

        private function postStringify($postArray) {
            $ps = '';
            foreach($postArray as $key => $value) { 
                $ps .= $key . '=' . $value . '&'; 
            }
            rtrim($ps, '&');
            $this->postString = $ps;    
        }

        private function isCurlInstalled() {
            return (in_array('curl', get_loaded_extensions())) ? true : false;
        }

        public function makeRequest() {
            if ($this->isCurlInstalled()) {
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $this->serviceURL);
                curl_setopt($ch, CURLOPT_POST, 1);
                curl_setopt($ch, CURLOPT_TIMEOUT, 10);            
                curl_setopt($ch, CURLOPT_POSTFIELDS, $this->postString);
                curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch, CURLOPT_HTTPHEADER, $this->headers);
                $this->response = curl_exec($ch);
                if ($this->response === false) $this->response = curl_error($ch);
                curl_close($ch);
            } else {
                $this->response = 'Need to install Curl!';
            }

            return $this->response;

        }

        public function debug() {
            var_dump($this->response);
        }

    }

?>

并在另一个AJAX请求调用的文件中:

    <?php

    include ('proxy.php');

    ini_set('display_errors',1); 
    error_reporting(E_ALL);

    $consumerKey = 'myKEY!';
    $consumerSecret = 'mySecret!';
    $bearerTokenCredentials = $consumerKey . ':' . $consumerSecret;
    $base64TokenCredentials = base64_encode($bearerTokenCredentials);

    $authProxy = new proxy('https://api.twitter.com/oauth2/token/');
    $authProxy->headers = array(
        'Content-Type: application/x-www-form-urlencoded',
        'Authorization: Basic ' . $base64TokenCredentials,
    );

    $response = $authProxy->makeRequest();
    if (is_null($response)) $authProxy->debug(); else echo $response;

?>

1 个答案:

答案 0 :(得分:2)

代理脚本只会将您的POST数据传递给Twitter。

在您的客户端代码中,您将使用类似yourProxyScript.php的内容,而不是使用Twitter的URL。在该代理脚本中,您将从$_POST以及您需要的任何其他数据和POST it to the Twitter API URL using cURL中获取所有内容。