如何设置正确的Accept HTTP头,以便使用GitHub的API请求另一种媒体类型(在本例中为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, "")
)
)
)
然后在markdown解析器中对其进行解析?
您正在使用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-原始资源共享