1

如何使用 GitHub 的 API设置正确的 Accept HTTP 标头以请求另一个媒体类型(在本例中为Html )?电流content object总是编码为 base64,但我需要它作为呈现的 html: application/vnd.github.VERSION.html+json

$.ajax({
    url: "https://api.github.com/repos/jquery-boilerplate/patterns/readme",
    headers: { 
        Accept: "application/vnd.github.v3.html+json"
    },
    dataType: 'jsonp',
    success: function (data) {
        console.log(data.data.content); // "IyNSZWN..."
    },
    error: function (error) {
        console.log(error);
    }
});

我也尝试过使用 jQuerys beforeSend,但没有成功:

beforeSend: function(jqXHR){
    jqXHR.setRequestHeader("Accept", "application/vnd.github.v3.html+json");
}

所以问题:

是否可以在不解码内容的情况下获取呈现的 html:

decodeURIComponent(
    window.escape(
        window.atob(
            data.data.content.replace(/[^A-Za-z0-9\+\/\=]/g, "")
        )
    )
)

并稍后在降价解析器中解析它?

4

1 回答 1

1

您正在使用dataType: "jsonp". JSONP 通过<script>在文档中插入标签以从另一个域加载数据来工作。而且由于<script>标签仅通过向 URL 发送 GET 请求来工作,而没有让您能够设置标头 - 您的Accept标头被忽略(您可以在您正在使用的浏览器的开发人员工具中验证这一点)。并且由于您的标头被忽略,它被赋予默认值Accept: */*,它加载编码数据。

解决方案是不使用 JSONP ( dataType: "jsonp"),而只是使用 JSON ( dataType: "json")。这将迫使 jQuery 不使用<script>标签,而是使用 XHR。但是,使用 XHR 会引发错误,因为数据位于另一个域中,并且您将违反相同的来源策略。为了解决这个问题,使用 GitHub 为您发出请求的域(发出请求的您的网站)设置一个 OAuth 应用程序,这将使您能够使用 JSON 数据类型发出跨域请求(这通过传递 CORS 来工作标题)。在此处阅读有关此内容的更多信息:

http://developer.github.com/v3/#cross-origin-resource-sharing

于 2013-02-22T21:35:29.410 回答