AJAX状态代码0与php代理 [英] AJAX Status Code 0 with php proxy

查看:704
本文介绍了AJAX状态代码0与php代理的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这个ajax web应用程序,我开发,基本上调用google仲裁api使用ajax并返回结果来做一些与他们。我知道AJAX不能自己进行跨域请求,所以我也放在一个基于Web服务器的php代理使用cURL接收URL,发出请求并发回数据。我有的问题是,无论我做什么,每个请求我返回一个Http状态代码0.我不完全确定什么代码0真正意味着,但我认为它与一个失败的连接有关。这是我的一些代码:

I have this ajax web application I am developing that essentially calls the google moderator api using ajax and returns the result to do something with them. I know that AJAX cannot make cross domain requests itself so I have also put in a web server based php proxy using cURL to take in the URLs, make the request and send back the data. The problem I have is that no matter what I do, every request I make returns in a Http status code of 0. I am not entirely sure what a code of 0 really means, but I think it has something to do with a failed connection. Here is some of my code:

function populate() {
        var number = parseInt('93683',16);
        var url='https://www.googleapis.com/moderator/v1/series/'+number+'?key='+superkey;
        var xhttp = null;
        xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange=function() {
            if (xhttp.readyState==4 && xhttp.status==200) {
                data = xhttp.responseText;
                data = data.slice(data.indexOf('{'));
                data = jQuery.parseJSON(data);
                alert(data.contents);
            }
            else {
                alert('Error: '+xhttp.status);
            }
        }
        xhttp.open("GET",base_url+url,true);
        xhttp.send(null);
    }

发生的是我发送请求和下面的php文件并发送请求。


What is happening is that I send the request and the following php file gets it and sends a request.

        // Script: Simple PHP Proxy: Get external HTML, JSON and more!
        //
        // *Version: 1.6, Last updated: 1/24/2009*
        // 
        // Project Home - http://benalman.com/projects/php-simple-proxy/
        // GitHub       - http://github.com/cowboy/php-simple-proxy/
        // Source       - http://github.com/cowboy/php-simple-proxy/raw/master/ba-simple-proxy.php
        // 
        // About: License
        // 
        // Copyright (c) 2010 "Cowboy" Ben Alman,
        // Dual licensed under the MIT and GPL licenses.
        // http://benalman.com/about/license/
        // 
        // About: Examples
        // 
        // This working example, complete with fully commented code, illustrates one way
        // in which this PHP script can be used.
        // 
        // Simple - http://benalman.com/code/projects/php-simple-proxy/examples/simple/
        // 
        // About: Release History
        // 
        // 1.6 - (1/24/2009) Now defaults to JSON mode, which can now be changed to
        //       native mode by specifying ?mode=native. Native and JSONP modes are
        //       disabled by default because of possible XSS vulnerability issues, but
        //       are configurable in the PHP script along with a url validation regex.
        // 1.5 - (12/27/2009) Initial release
        // 
        // Topic: GET Parameters
        // 
        // Certain GET (query string) parameters may be passed into ba-simple-proxy.php
        // to control its behavior, this is a list of these parameters. 
        // 
        //   url - The remote URL resource to fetch. Any GET parameters to be passed
        //     through to the remote URL resource must be urlencoded in this parameter.
        //   mode - If mode=native, the response will be sent using the same content
        //     type and headers that the remote URL resource returned. If omitted, the
        //     response will be JSON (or JSONP). <Native requests> and <JSONP requests>
        //     are disabled by default, see <Configuration Options> for more information.
        //   callback - If specified, the response JSON will be wrapped in this named
        //     function call. This parameter and <JSONP requests> are disabled by
        //     default, see <Configuration Options> for more information.
        //   user_agent - This value will be sent to the remote URL request as the
        //     `User-Agent:` HTTP request header. If omitted, the browser user agent
        //     will be passed through.
        //   send_cookies - If send_cookies=1, all cookies will be forwarded through to
        //     the remote URL request.
        //   send_session - If send_session=1 and send_cookies=1, the SID cookie will be
        //     forwarded through to the remote URL request.
        //   full_headers - If a JSON request and full_headers=1, the JSON response will
        //     contain detailed header information.
        //   full_status - If a JSON request and full_status=1, the JSON response will
        //     contain detailed cURL status information, otherwise it will just contain
        //     the `http_code` property.
        // 
        // Topic: POST Parameters
        // 
        // All POST parameters are automatically passed through to the remote URL
        // request.
        // 
        // Topic: JSON requests
        // 
        // This request will return the contents of the specified url in JSON format.
        // 
        // Request:
        // 
        // > ba-simple-proxy.php?url=http://example.com/
        // 
        // Response:
        // 
        // > { "contents": "<html>...</html>", "headers": {...}, "status": {...} }
        // 
        // JSON object properties:
        // 
        //   contents - (String) The contents of the remote URL resource.
        //   headers - (Object) A hash of HTTP headers returned by the remote URL
        //     resource.
        //   status - (Object) A hash of status codes returned by cURL.
        // 
        // Topic: JSONP requests
        // 
        // This request will return the contents of the specified url in JSONP format
        // (but only if $enable_jsonp is enabled in the PHP script).
        // 
        // Request:
        // 
        // > ba-simple-proxy.php?url=http://example.com/&callback=foo
        // 
        // Response:
        // 
        // > foo({ "contents": "<html>...</html>", "headers": {...}, "status": {...} })
        // 
        // JSON object properties:
        // 
        //   contents - (String) The contents of the remote URL resource.
        //   headers - (Object) A hash of HTTP headers returned by the remote URL
        //     resource.
        //   status - (Object) A hash of status codes returned by cURL.
        // 
        // Topic: Native requests
        // 
        // This request will return the contents of the specified url in the format it
        // was received in, including the same content-type and other headers (but only
        // if $enable_native is enabled in the PHP script).
        // 
        // Request:
        // 
        // > ba-simple-proxy.php?url=http://example.com/&mode=native
        // 
        // Response:
        // 
        // > <html>...</html>
        // 
        // Topic: Notes
        // 
        // * Assumes magic_quotes_gpc = Off in php.ini
        // 
        // Topic: Configuration Options
        // 
        // These variables can be manually edited in the PHP file if necessary.
        // 
        //   $enable_jsonp - Only enable <JSONP requests> if you really need to. If you
        //     install this script on the same server as the page you're calling it
        //     from, plain JSON will work. Defaults to false.
        //   $enable_native - You can enable <Native requests>, but you should only do
        //     this if you also whitelist specific URLs using $valid_url_regex, to avoid
        //     possible XSS vulnerabilities. Defaults to false.
        //   $valid_url_regex - This regex is matched against the url parameter to
        //     ensure that it is valid. This setting only needs to be used if either
        //     $enable_jsonp or $enable_native are enabled. Defaults to '/.*/' which
        //     validates all URLs.
        // 
        // ############################################################################

        // Change these configuration options if needed, see above descriptions for info.
        $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;
        }

        ?>

我从php脚本的响应说,状态代码是0,内容为null,如果我做一个简单的xmlhttp.status它说200.这个问题已经挫败我一个星期。是PHP脚本或我的ajax的问题​​,或什么?

My response from the php script says that the status code is 0 and the contents are null yet if I do a simple xmlhttp.status it says 200. This problem has been frustrating me for a week. Is the problem with the PHP script or my ajax, or what?

推荐答案

我发现问题是你不能使用php代理在本地主机服务器上。它需要托管在可以与其他外部服务器通信的真实服务器上。这样做最终允许我进行跨域请求,但我只能限制我只有POST和GET请求。

I found that the problem was that you cannot use a php proxy on a localhost server. It needs to be hosted on a real server that can talk to other outside servers. Doing this ending up allowing me to make cross domain request as I please but it limits me to only POST and GET requests.

这篇关于AJAX状态代码0与php代理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆