我目前正在构建一个ASP.NET网络应用程序,以简化Google协作平台,网页,Google协作平台上的小工具和Google协作平台的配置。
我遇到过许多开发人员已经遇到的问题:跨源资源。根据有关对Google API的CORS请求的Google文档,您只需使用XMLHttpRequest(或AJAX)请求,在标头中提供访问令牌。更多信息可以在这里找到:
https://developers.google.com/api-client-library/javascript/features/cors
当我在Google协作平台上访问Google协作平台API时,我完全能够完成此操作,在浏览器窗口的位置位于域内时注入AJAX请求。从我的域中创建新网站的成功请求的示例:
$.ajax(
{
////// REQUEST \\\\\\
type: "POST",
url: "https://sites.google.com/feeds/site/[domainName]",
contentType: "application/atom+xml",
headers: {
"Authorization": "Bearer " + [accessToken],
"GData-Version": "1.4"
},
data: ["<entry xmlns='http://www.w3.org/2005/Atom' xmlns:sites='http://schemas.google.com/sites/2008'>",
"<title>What a site</title>",
"<summary>Best description ever.</summary>",
"<sites:theme>ski</sites:theme>",
"</entry>"].join(""),
////// LOGGING \\\\\\
beforeSend: function () {
console.log('-------Making-the-request-------');
},
success: function (result) {
console.log(result);
},
error: function (xhr, ajaxOptions, thrownError) {
console.log(thrownError);
console.log(xhr.status);
}
});
(在下面的几个案例中,由于我的帐户仍被限制为帖子中的2个链接,因此我将https://写为[https]。)
此时一切都很顺利,我以为我已经将所有内容设置为使用代码进入我的ASP.NET站点。唉,事情并不总是有计划的。当我从我的应用程序中执行完全相同的AJAX调用时(现在仍然托管在[https] localhost:44301上),我收到以下错误:
XMLHttpRequest无法加载 [https] sites.google.com/feeds/site/ [censored]对预检的回应 请求未通过访问控制检查:否 &#39;访问控制允许来源&#39;标题出现在请求的上 资源。 Origin&#39; [https] localhost:44301&#39;因此是不允许的 访问。响应的HTTP状态代码为405。
通常的CORS错误。我很惊讶,因为向Google API提出请求的建议方式就是这样。我还发现了一篇关于将CORS与Google Cloud API结合使用的文章:
https://cloud.google.com/storage/docs/cross-origin
在文章中指出:
大多数客户端(例如浏览器)使用XMLHttpRequest对象进行制作 跨域请求。 XMLHttpRequest负责所有的工作 插入正确的标题并处理与CORS的交互 服务器。这意味着您不能添加任何新代码以利用 CORS支持,它将按预期用于Google云存储 为CORS配置的存储桶。
当然,这不是Google Sites API,但我发现很难相信Google在其所有API中都没有实现相同的功能。
有没有人知道是否可以在独立的ASP.NET应用程序中实现这样的成功请求?如果是这样,怎么样?
非常感谢花时间阅读我的艰辛。
更新
我已就我的问题与Google Apps支持小组联系,并得到了以下回复:
除了您提供的信息外,我还审核了您的帖子 在 CORS authenticated requests to Google Sites feed/API blocked。 的说明 https://developers.google.com/google-apps/sites/docs/1.0/developers_guide_java#SiteFeedPOST 只会加强“我可以创建新的Google网站”下的声明吗?&#39; 和&#39;如何复制网站?&#39;在 https://developers.google.com/google-apps/sites/faq#Getting__Started, 表明Google Apps用户可以使用网站Feed来实现...&#39;然而, 如果您已获得授权,我不明白为什么这与您的问题相关 针对您的域管理员帐户,仅作为备注 表明gmail.com用户无法使用列出的内容 创建或复制网站的方法。
我还没有使用CORS,因此无法评论它的操作,但已经过 能够使用HTTP GET和POST成功列出和创建站点 通过原始HTTP客户端请求,因此API正在按预期运行 关于跨域请求。我使用了示例XML文档 在 https://developers.google.com/google-apps/sites/docs/1.0/developers_guide_protocol#SitesFeedPOST 创建我的网站,使用我的凭据配置客户端 Developer Console项目。请求仅失败的事实 您的ASP.NET站点意味着该环境中存在某些内容 没有正确配置。不幸的是,这不在我的身边 支持范围,所以我无法提供任何具体的建议,其他 而不是检查相关文件,或在。中发布请求 Stack Overflow的ASP.NET部分 https://stackoverflow.com/questions/tagged/asp.net
答案 0 :(得分:0)
删除"GData-Version": "1.4"
后可以再试一次吗?
如果您确实要发送此值,请通过添加查询参数(例如v=X.0
)来发送该值。资源来自here
<强>更新:强>
&#34;注意:此功能仅适用于Google Apps域。&#34; From guides
答案 1 :(得分:0)
<强>解决强>
似乎许多浏览器仍会阻止跨不同域的AJAX请求,即使您尝试访问的API允许这样做。我现在在DLL中使用C#WebRequest
而不是使用AJAX。
示例:
// Create the request
WebRequest request = WebRequest.Create("https://sites.google.com/feeds/site/[domainName]");
request.Method = "POST";
request.contentType = "application/atom+xml";
request.Headers.Set(HttpRequestHeader.Authorization, "Bearer " + [accessToken]);
request.Headers["GData-Version"] = "1.4";
// Fill in the data and encode for the datastream
string data = ["<entry xmlns='http://www.w3.org/2005/Atom' xmlns:sites='http://schemas.google.com/sites/2008'>",
"<title>What a site</title>",
"<summary>Best description ever.</summary>",
"<sites:theme>ski</sites:theme>",
"</entry>"].join("");
byte[] byteArray = Encoding.UTF8.GetBytes (data);
// Add the data to the request
Stream dataStream = request.GetRequestStream ();
dataStream.Write (byteArray, 0, byteArray.Length);
dataStream.Close ();
// Make the request and get the response
WebResponse response = request.GetResponse ();
可以在MSDN上找到更多信息: https://msdn.microsoft.com/en-us/library/debx8sh9(v=vs.110).aspx