PHP прокси-сервер и вызов JSON? - PullRequest
0 голосов
/ 13 августа 2011

Хорошо, я пытаюсь получить доступ к некоторому JSON с помощью прокси-сервера PHP, как мне сказали, это единственный способ сделать кросс-доменный доступ, когда вы не контролируете политики сайтов.

Ниже приведен код, который я пытаюсь использовать в качестве прокси-сервера php для совместного использования другим пользователем stackoverflow:

function curl_download($Url){

    // is cURL installed yet?
    if (!function_exists('curl_init')){
        die('Sorry cURL is not installed!');
    }

    // OK cool - then let's create a new cURL resource handle
    $ch = curl_init();

    // Now set some options (most are optional)

    // Set URL to download
    curl_setopt($ch, CURLOPT_URL, $Url);

    // Set a referer
    curl_setopt($ch, CURLOPT_REFERER, "http://www.example.org/yay.htm");

    // User agent
    curl_setopt($ch, CURLOPT_USERAGENT, "MozillaXYZ/1.0");

    // Include header in result? (0 = yes, 1 = no)
    curl_setopt($ch, CURLOPT_HEADER, 0);

    // Should cURL return or print out the data? (true = return, false = print)
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    // Timeout in seconds
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);

    // Download the given URL, and return output
    $output = curl_exec($ch);

    // Close the cURL resource, and free system resources
    curl_close($ch);

    return $output;
}

проблема в том, что когда я заменяю $ URL на http://www.nfl.com/liveupdate/scorestrip/ss.json, похоже, ничего не происходит. Я не совсем уверен, как использовать этот прокси-сервер PHP, хотя я никогда не делаю такого рода вещи.

Предполагается ли создать это в отдельном php-файле, а затем отправить запрос на этот код? Я как бы против стены о том, что именно делать здесь, чтобы получить доступ к json с сайта выше.

Ответы [ 2 ]

1 голос
/ 13 августа 2011

Предполагается ли создать это в отдельном php-файле, а затем отправить запрос на этот код?

Да. Приведенный выше код должен повторно отправить ваш запрос от JS на удаленный сервис в другом домене. Вот что делает трюк - включает междоменные POST-запросы от JS.

<?php

$server_url = "http://example.com/";

$options = array
(
    CURLOPT_HEADER         => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_CONNECTTIMEOUT => 0,
    CURLOPT_HTTPGET        => 1
);

$service = $_GET["service"];

$request_headers = Array();
foreach($_SERVER as $i=>$val) {
        if (strpos($i, 'HTTP_') === 0) {
                $name = str_replace(array('HTTP_', '_'), array('', '-'), $i);
                if ($name != 'HOST')
                {
                    $request_headers[] = "{$name}: {$val}";
                }
        }
}

$options[CURLOPT_HTTPHEADER] = $request_headers;

switch (strtolower($_SERVER["REQUEST_METHOD"]))
{

    case "post":
        $options[CURLOPT_POST] = true;
        $url = "{$server_url}/services/".$service;

        $options[CURLOPT_POSTFIELDS] = file_get_contents("php://input");

        break;
    case "get":

        unset($_GET["service"]);

        $querystring = "";
        $first = true;
        foreach ($_GET as $key => $val)
        {
            if (!$first) $querystring .= "&";
            $querystring .= $key."=".$val;
            $first = false;
        }

        $url = "{$server_url}/services/".$service."?".$querystring;

        break;
    default:
        throw new Exception("Unsupported request method.");
        break;

}

$options[CURLOPT_URL] = $url;

$curl_handle = curl_init();

curl_setopt_array($curl_handle,$options);
$server_output = curl_exec($curl_handle);
curl_close($curl_handle);

$response = explode("\r\n\r\n",$server_output);
$headers = explode("\r\n",$response[0]);

foreach ($headers as $header)
{
    if ( !preg_match(';^transfer-encoding:;ui', Trim($header))  )
    {
        header($header);
    }
}

echo $response[1]; 

Это слегка измененная версия скрипта, которую я использую, к сожалению, не очень хорошо документирована.

Надеюсь, это поможет.

0 голосов
/ 05 ноября 2011

Я бы предложил использовать простой прокси-сервер Ben Almans

Простой PHP Proxy

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...