简体   繁体   中英

Cross-Domain Ajax GET request with php proxy

I have been pulling my hair out over this for the past couple of days. I am trying to get a cross-domain ajax GET request from a public API to work but I just can't get it to work at all.

PHP: I am using Ben Alman's ba-simple-proxy ( https://github.com/cowboy/php-simple-proxy )

    <?PHP
    $enable_jsonp    = false;
    $enable_native   = false;
    $valid_url_regex = '/.*/';

    $url = $_GET['url'];
    if ( !$url ) {

      // Passed url not specified.
      $contents = 'ERROR: url not specified';
      $status = array( 'http_code' => 'ERROR' );

    } else if ( !preg_match( $valid_url_regex, $url ) ) {

      // Passed url doesn't match $valid_url_regex.
      $contents = 'ERROR: invalid url';
      $status = array( 'http_code' => 'ERROR' );

    } else {
      $ch = curl_init( $url );

      if ( strtolower($_SERVER['REQUEST_METHOD']) == 'post' ) {
        curl_setopt( $ch, CURLOPT_POST, true );
        curl_setopt( $ch, CURLOPT_POSTFIELDS, $_POST );
      }

      if ( $_GET['send_cookies'] ) {
        $cookie = array();
        foreach ( $_COOKIE as $key => $value ) {
          $cookie[] = $key . '=' . $value;
        }
        if ( $_GET['send_session'] ) {
          $cookie[] = SID;
        }
        $cookie = implode( '; ', $cookie );

        curl_setopt( $ch, CURLOPT_COOKIE, $cookie );
      }

      curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
      curl_setopt( $ch, CURLOPT_HEADER, true );
      curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );

      curl_setopt( $ch, CURLOPT_USERAGENT, $_GET['user_agent'] ? $_GET['user_agent'] : $_SERVER['HTTP_USER_AGENT'] );

      list( $header, $contents ) = preg_split( '/([\r\n][\r\n])\\1/', curl_exec( $ch ), 2 );

      $status = curl_getinfo( $ch );

      curl_close( $ch );
    }
    // Split header text into an array.
    $header_text = preg_split( '/[\r\n]+/', $header );
    if ( $_GET['mode'] == 'native' ) {
      if ( !$enable_native ) {
        $contents = 'ERROR: invalid mode';
        $status = array( 'http_code' => 'ERROR' );
      }

      // Propagate headers to response.
      foreach ( $header_text as $header ) {
        if ( preg_match( '/^(?:Content-Type|Content-Language|Set-Cookie):/i', $header ) ) {
          header( $header );
        }
      }

      print $contents;

    } else {

      // $data will be serialized into JSON data.
      $data = array();

      // Propagate all HTTP headers into the JSON data object.
      if ( $_GET['full_headers'] ) {
        $data['headers'] = array();

        foreach ( $header_text as $header ) {
          preg_match( '/^(.+?):\s+(.*)$/', $header, $matches );
          if ( $matches ) {
            $data['headers'][ $matches[1] ] = $matches[2];
          }
        }
      }

      // Propagate all cURL request / response info to the JSON data object.
      if ( $_GET['full_status'] ) {
        $data['status'] = $status;
      } else {
        $data['status'] = array();
        $data['status']['http_code'] = $status['http_code'];
      }

      // Set the JSON data object contents, decoding it from JSON if possible.
      $decoded_json = json_decode( $contents );
      $data['contents'] = $decoded_json ? $decoded_json : $contents;

      // Generate appropriate content-type header.
      $is_xhr = strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest';
      header( 'Content-type: application/' . ( $is_xhr ? 'json' : 'x-javascript' ) );

      // Get JSONP callback.
      $jsonp_callback = $enable_jsonp && isset($_GET['callback']) ? $_GET['callback'] : null;

      // Generate JSON/JSONP string
      $json = json_encode( $data );

      print $jsonp_callback ? "$jsonp_callback($json)" : $json;

    }
    ?>

The API I am trying to get info from is the aviationweather API. Endpoint url:

https://www.aviationweather.gov/adds/dataserver_current/httpparam?datasource=metars&requestType=retrieve&format=xml&mostRecentForEachStation=constraint&hoursBeforeNow=1.25

jQuery:

function getMetarToTable(){
        var proxy = 'simple-proxy.php',
        url=proxy + '?' +'https://www.aviationweather.gov/adds/dataserver_current/httpparam?datasource=metars&requestType=retrieve&format=xml&mostRecentForEachStation=constraint&hoursBeforeNow=1.25';

    var stationt="KJFK";
    $.ajax({
    type: "GET",
    url: url,
    crossDomain: true,
    data: {'stationString': stationt},
    datatype: "xml",
    error: function(jqXHR, textStatus, errorThrown) {
    console.log('Error: ' + errorThrown);
     },
    success: function(xml) {
    $("#metarweatherpage").html('');
    $(xml).find('METAR').each(function(){

    var sRawtext = $(this).find('raw_text').text();
    var sStationid = $(this).find('station_id').text();
    $("#metarweatherpage").append('<p><h2>'+sStationid+'</h2></p><p>'+sRawtext+'</p>');

     });
    },

    });

};

I would really appreciate any help I can get.

From the PHP:

$url = $_GET['url'];

It is trying to read the URL from a query string parameter called url .

From the JavaScript:

url=proxy + '?' +'https://www.aviationweather.gov/adds/dataserver_current/httpparam?datasource=metars&requestType=retrieve&format=xml&mostRecentForEachStation=constraint&hoursBeforeNow=1.25';

You are passing the data raw, without encoding it as a query string.

To do that:

var url = 'https://www.aviationweather.gov/adds/dataserver_current/httpparam?datasource=metars&requestType=retrieve&format=xml&mostRecentForEachStation=constraint&hoursBeforeNow=1.25'
var query = encodeURIComponent("url") + "=" + encodeURIComponent(url);
var proxy_url = proxy + "?" + query;

That said, you are using jQuery already so you shouldn't be constructing the URL manually in the first place:

var url = 'https://www.aviationweather.gov/adds/dataserver_current/httpparam?datasource=metars&requestType=retrieve&format=xml&mostRecentForEachStation=constraint&hoursBeforeNow=1.25'

$.ajax({
    type: "GET",
    url: proxy,
    data: {'url': url},
    // etc

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM