使用 php 代理跨域 Ajax GET 请求

2024-01-01

在过去的几天里,我一直在为这件事烦恼。我试图从公共 API 获取跨域 ajax GET 请求,但我根本无法让它工作。

PHP:我正在使用 Ben Alman 的 ba-simple-proxy (https://github.com/cowboy/php-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;

    }
    ?>

我试图从中获取信息的 API 是 Aviationweather API。端点网址:

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>');

     });
    },

    });

};

我真的很感激我能得到的任何帮助。


来自 PHP:

$url = $_GET['url'];

它正在尝试从名为的查询字符串参数读取 URLurl.

来自 JavaScript:

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

您正在传递原始数据,而不将其编码为查询字符串。

要做到这一点:

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;

也就是说,您已经在使用 jQuery,因此您不应该首先手动构建 URL:

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 php 代理跨域 Ajax GET 请求 的相关文章

  • 如何在HTML中的PHP中注释掉HTML和PHP?

    这是我想注释掉的一行代码 h1 class post title a href title a h1 一种流行的注释方法是分别注释 html 和 php 有一个更好的方法吗
  • 使用 Instagram Basic Display API 时出现“无效平台应用程序”错误

    我正在尝试使用 Instagram Basic 显示 API 但是当我发布授权代码以获取访问令牌时 我不断收到以下错误 error type OAuthException 代码 400 error message 平台应用无效 我正在遵循此
  • 如何使用 JavaScript 中的值填充下拉列表?

    我在 Tridion CMS 扩展中的功能区工具栏按钮中添加了一个按钮 单击该按钮后 将显示一个弹出页面 其中包含两个下拉菜单 通过更改第一个下拉控件中的值 我应该填充第二个下拉控件的值 就我而言 我正在使用ASP drop down li
  • 非 DOM 对象上的 jQuery 自定义事件

    我最近阅读了一些代码 其功能如下 bob name Bob Smith rank 7 bob bind nameChanged function bob trigger nameChanged 这似乎有效 但我在 jQuery 文档或源代码
  • 在网页上的文本框中键入内容时删除所有空格

    我如何在用户打字时即时删除输入到文本框中的空格 function var txt myTextbox var func function txt val txt val replace s g txt keyup func blur fun
  • 动画进度元素值

    我有一个progress元素 该元素如下所示 div class container div div div
  • 检查 touchend 是否在拖动后出现

    我有一些代码可以更改表的类 在手机上 有时表格对于屏幕来说太宽 用户将拖动 滚动来查看内容 但是 当他们触摸并拖动表格时 每次拖动都会触发 touchend 如何测试触摸端是否是触摸拖动的结果 我尝试跟踪dragstart和dragend
  • PHP 扩展开发入门 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 请推荐有关 PHP 低 级 modules 编程接口的帮助文章或教程 搜索我的书签 我发现的唯一链接是
  • PHP print_r() 中 _r 的含义是什么?

    我见过这个答案 https stackoverflow com questions 13103410 what does r suffix mean就这样 但我不确定它对于 PHP 是否相同 如果是 可重入的含义是什么 From PHP n
  • 如何通过php获取网页的Open Graph协议?

    PHP 有一个简单的命令来获取网页的元标记 get meta tags 但这仅适用于具有名称属性的元标记 然而 开放图谱协议如今变得越来越流行 从网页获取 opg 值的最简单方法是什么 例如 我看到的基本方法是通过 cURL 获取页面并使用
  • 通过 node-http-proxy 保留基于 cookie 的会话

    我有一个简单的基于 Express 的 Node js Web 服务器 用于开发 JavaScript 应用程序 我将服务器设置为使用 node http proxy 来代理应用程序向在不同域和端口上运行的 Jetty 服务器发出的 API
  • PHP 中的引用

    我正在编写一个自定义博客引擎 并且希望拥有类似于 Wordpress 的引用 我可以查看 WordPress 源代码 但我真的更喜欢某种教程 但到目前为止我还没有找到 有没有关于在 PHP5 中实现 trackbacks 或 pingbac
  • 如果链接包含特定文本,jQuery 将类添加到 href

    我的网站上的列表中有一些动态填充的链接 这些链接链接到文件 是否可以使用 jQuery 查看文件名是否以 pdf 结尾 并在 href 或类似的链接文本以 mp3 结尾时添加一个类 例如 我的列表中有以下链接 文件1 pdf 歌曲1 mp3
  • WordPress 自定义帖子类型未显示在搜索结果中

    我在 WordPress 中遇到自定义帖子类型 测验 和搜索的问题 自定义帖子类型未显示在我的搜索结果页面中 我的搜索结果中仅显示默认的帖子内容 以下是我使用的代码 函数 php函数create posttype register post
  • 我可以在 PHP 会话变量中安全地存储用户名和密码吗?

    我想在 REST api 之上制作一个轻量级的 web 应用程序 用户只需进行一次身份验证 从那时起 所有针对 web api 的请求都希望通过以某种方式保持用户名和密码有效来完成 我已经做了一个工作原型我在哪里将用户名和密码存储在会话变量
  • 淡出和循环一组 div 的最佳方式

    假设我有以下 div div class a You are funny div div class b You are smart div div class c You are cool div 最好的展示方式是什么div a持续 5
  • :jQuery / Sizzle 中的 nth-of-type()?

    让我惊讶的是Sizzle http sizzlejs com jQuery 使用的选择器引擎 带有一个内置的 nth child 选择器 但缺少 nth of type 选择器 为了说明之间的区别 nth child and nth of
  • 优雅降级 - 何时考虑

    在为使用 AJAX 的应用程序设计和构建 UI 时 您何时考虑优雅降级 对于禁用 JavaScript 或正在使用屏幕阅读器的用户 最后 网站的 AJAX 版本完全完成后 在每个发展阶段 I don t 还有别的事 这些日子 渐进增强 ht
  • 如何清除 APC 缓存而不使 Apache 崩溃?

    如果 APC 存储大量条目 清除它们会导致 httpd 崩溃 如果 apc clear cache user 花费的时间超过 phps max execution time 调用 apc clear cache 的脚本 将在之前被 php
  • ZF3/2 - 如何捕获 EVENT_DISPATCH 侦听器中引发的异常?

    有什么方法可以在 EVENT DISPATCH 监听器中抛出异常吗 class Module public function onBootstrap EventInterface event application event gt get

随机推荐

  • 设置 SCSS 颜色变量不起作用

    我想在 SCSS 中定义自己的颜色变量 但是如何定义呢 我检查了这个网站 https htmlcolorcodes com tutorials scss color variables 并做了那里描述的一切 但它不起作用 我已经安装了预处理
  • 在 ASPNET MVC 中通过身份验证提供 iCalendar 文件

    我正在尝试在我的 MVC 应用程序中提供 iCalendar 文件 ics 到目前为止一切正常 我有一部 iPhone 订阅了日历的 URL 但现在我需要为每个用户提供个性化的日历 在 iPhone 上订阅日历时 我可以输入用户名和密码 但
  • 我需要担心阻塞任务吗?

    我需要在多大程度上担心 NET 中的阻塞任务 即 NET 任务调度程序如何处理线程池中线程的阻塞和超额订阅 例如 如果我的任务中有一些 IO 我是否应该始终使用LongRunning暗示 或者任务调度程序启发式处理得更好吗 在C 中有一个O
  • 实现滑动刷新布局后,回收器视图无法正确滚动

    在实现 滑动刷新 视图之前 回收器视图运行顺利 但每当我尝试向下滚动回收器视图时 滑动刷新 都会干扰并阻碍滚动移动 这是问题的屏幕截图 请注意 当回收器视图向下滚动时 会出现滑动刷新布局 这是我的布局片段
  • 命令行 Java 调试器

    有没有好的java命令行调试器 我给了 JDB 一个机会 但命令行界面很糟糕 如果我想更改最后一行并重新执行它 我必须重新输入整行 点击 向上箭头 只会给我 A 包 类 方法名也没有完成 GDB 是一个不错的选择 但我不知道如何用它进行远程
  • R 中的全局变量和局部变量

    我是 R 的新手 我对 R 中局部变量和全局变量的使用感到很困惑 我在互联网上读到一些帖子说如果我使用 or lt 我将在当前环境中分配变量 并使用 lt lt 我可以在函数内部访问全局变量 然而 据我记得 在 C 中 每当在括号内声明变量
  • 如何将引号传递给javascript函数

    我有一个 javascript 函数 它接受包含引号的字符串并显示在输入字段中 但是这个函数不接受引号后面的字符串 function searchFormatter cellvalue options rowObject return
  • 如何在 JavaScript 中实现类似 Swift 的枚举以及关联值?

    Swift 语言拥有出色的枚举支持 人们不仅可以用案例定义标准枚举 而且案例还可以具有 与其关联 的可选值 例如 摘自 Swift 文档 enum Barcode case UPCA Int Int Int Int case QRCode
  • 如何关闭Android Studio 3.0标签? [复制]

    这个问题在这里已经有答案了 我刚刚升级到 Android Studio 3 0 我注意到我的代码中到处都是奇怪的标签 标签 我无法手动删除这些标签 因为光标只是跳过它们 如何关闭这些标签 Android Studio 具有与 Intelli
  • 有什么方法可以在 Java/Eclipse 中对方法进行分组吗?

    我希望能够将类似的方法分组并让它们出现在 Eclipse 的大纲视图中 这使得浏览大量代码变得更容易 并且更容易找到所需的方法 在 Objective C 中 有一个可以设置的 pragma mark 命令 java eclipse 有类似
  • 当 KVM-QEMU 打开时,Intel-PT 不记录任何数据包

    我尝试在主机上使用 Intel PT 同时在客户机上运行通用软件程序 所以我期望主机中运行的 Intel PT 将记录所有相关数据包 如 PIP FUP TSC 等 以及所有基于 VM 的数据包 如 VMCS 我使用以下命令 perf kv
  • 授权请求出现问题

    我正在尝试在 Sinch 服务中发出conferenceCallout 请求 但我在签名方面遇到问题 我粘贴代码
  • 如何获取 Administration_area_level_1、2 等类型的名称

    我正在使用谷歌地图 API http code google com apis maps documentation geocoding 我了解如何进行查询并解析返回的 JSON 我想要做的是获取 Administration area l
  • Flask Google Cloud App Engine:OSError:[Errno 98]地址已在使用中

    我正在尝试在谷歌云应用程序引擎上部署烧瓶应用程序 它在本地虚拟环境中运行顺利 但在云中运行时出现 502 错误 现在我尝试使用调试模式和 SSH 进入我的实例 在云服务器上调试我的代码 使用docker exec it ID bin bas
  • GAE App Engine Websocket 客户端在 1 小时后断开连接

    我有一个简单的 Websocket 服务器部署到 AppEngine 恰好 1 小时后客户端断开连接 错误代码为 1006 我相信这是由于 nginx 负载均衡器而发生的 我尝试更改 nginx app conf 但没有帮助 proxy s
  • 为什么scala无法推断方法参数的类型

    我想知道为什么 scala 不能推断方法参数的类型 我可以看到在 haskel 也有类型推断 中可以做同样的事情 那为什么不选择 scala 呢 首先 Scala 中的情况与 Haskell 中的情况有很大不同 因为它是一种 OO 语言 并
  • 突出显示 amcharts 中的最高点和最低点

    有人可以帮助我更改项目符号或使用 amcharts 突出显示最高和最低值吗 我正在使用序列图 函数 突出显示 中给出的条件是匹配的 但是项目符号没有突出显示到最高点和最低点 任何帮助将不胜感激 请在下面找到我的代码
  • != 检查线程安全吗?

    我知道复合操作例如i 不是线程安全的 因为它们涉及multiple运营 但是检查引用本身是线程安全的操作吗 a a is this thread safe 我尝试对此进行编程并使用多个线程 但没有失败 我想我无法在我的机器上模拟比赛 EDI
  • 检查 PHP 中的会话是否是新的

    我有一个网站 需要在每个用户会话中执行一次特定的后端功能 因此 我希望能够确定任何给定的页面视图是否是给定会话中的第一个 根据 PHP 文档 会话开始 创建一个会话或恢复当前会话 通过 GET 或 POST 请求传递的会话标识符 或通过 曲
  • 使用 php 代理跨域 Ajax GET 请求

    在过去的几天里 我一直在为这件事烦恼 我试图从公共 API 获取跨域 ajax GET 请求 但我根本无法让它工作 PHP 我正在使用 Ben Alman 的 ba simple proxy https github com cowboy