如何通过 JSONP 或 HTTP 代理访问 Rally REST API 的 JSON 响应?

Posted

技术标签:

【中文标题】如何通过 JSONP 或 HTTP 代理访问 Rally REST API 的 JSON 响应?【英文标题】:How to access Rally REST API's JSON response via either JSONP or HTTP Proxy? 【发布时间】:2011-11-30 02:38:01 【问题描述】:

这是我在 *** 上的第一篇文章,尽管这些年来我一直是常客!

我们有一个用 ASP 编写的内部缺陷跟踪应用程序。我们有一个手动流程,通过该流程我们将所有相关的 Rally 用户故事信息复制到我们网站的“规格”部分。我正在尝试使用 JQuery 和 JSON 在我们的站点中动态显示此信息。在我让它在 ASP 页面中工作之前,我正在使用 XAMPP 在我的本地机器上对其进行测试。

我在尝试通过 JQuery 访问 API 时遇到了 Access-Control-Allow-Origin 异常。我尝试加载的示例页面是:https://rally1.rallydev.com/slm/webservice/1.26/project.js。

代码如下:

<script>
$(document).ready(function()

    $.getJSON("https://rally1.rallydev.com/slm/webservice/1.26/project.js", 
        function(data) 

            $.each(data.QueryResult.Results, function(i, result) 
            $("<option>").attr("value", result._refObjectName).text(result._refObjectName).appendTo("#dd_ItSel");
            );
        )
        .success(function() console.log("dd-It-success"); )
        .error(function()  console.log("dd-It-error");)
        .complete(function()  console.log("dd-It-complete"); )
        ;
);
</script>

这将加载到以下下拉列表中:

<select name="projectSelect" id="dd_projSel"></select>

根据 Rally API 文档https://rally1.rallydev.com/slm/doc/webservice/rest_json.jsp 中的此页面,要绕过此限制,我们应该使用 HTTP 代理或使用 JSONP 回调功能。我已尝试在我的页面 () 中包含 Yahoo API,并尝试使用显示在 Rally API 示例页面上的一些代码,但无法使其正常工作。

This page uses the YUI Connect method to submit an asyncrounous request against the JSON REST API. A javascript function is used in the request callback to render the object graph below.

var graphContainer = document.getElementById('graph');

var callbacks = 
    success: function(response) 
        drawGraph(document.getElementById('graph'), YAHOO.lang.JSON.parse(response.responseText));
    ,
    failure: function() 
         alert('JSON REST API request failed');
         document.getElementById('graph').innerhtml = '';
    
;

YAHOO.util.Connect.asyncRequest('GET', 'https://rally1.rallydev.com/slm/webservice/1.27/project.js?workspace=https://rally1.rallydev.com/slm/webservice/1.27/workspace/620327365&query=&start=1&pagesize=20', callbacks);

我也尝试过像他们在文档中提到的那样包含 JSONP 响应变量,但也无法让它工作:

有没有人成功使用代理方法或 JSONP 方法?我假设 JSONP 方法更容易开始工作;是这样吗?如果没有,有人可以帮助指导我获取有关如何为此用途设置 HTTP 代理的资源吗?

如果 JSONP 方法更简单,我该如何让它工作?有没有人可以分享任何工作示例?

抱歉,写得这么长,我认为最好展示一下我一直在尝试的内容以及我从哪里获取信息。

非常感谢!

【问题讨论】:

【参考方案1】:

以下是使用 JSONP 和 jQuery 发出请求的方式:

<script>

    $(document).ready(function()

        $.ajax(
          url: "https://rally1.rallydev.com/slm/webservice/1.26/project.js",
          dataType: 'jsonp',
          jsonp: 'jsonp',
          success: function(data, textStatus, jqXHR)
            console.log(data);
            //deal with data here
          
        );

    );

</script>

dataType 配置告诉 jQuery 使用 JSONP。 jsonp 配置告诉 jQuery 使用“jsonp”作为请求参数而不是默认的“回调”,因为 Rally API 使用“jsonp”。

【讨论】:

以上是关于如何通过 JSONP 或 HTTP 代理访问 Rally REST API 的 JSON 响应?的主要内容,如果未能解决你的问题,请参考以下文章

跨域访问

我如何通过 php 附加 jsonp 数组返回

说说JSONP

javascript-代理模式

pacemaker+corosync/heartbeat高可用集群对比及资源代理RA脚本

vue访问外部url会被取消