我已经编写了一个小型rails应用程序,通过xmlhttprequests向另一个站点提供内容,这些站点将在另一个域上运行(无法让它们在同一台服务器上运行).我知道我需要在我的rails服务器上设置access-control-allow-origin,以允许请求的网页访问这些资料.
似乎有很好的文档说明如何使用Apache,这可能是我部署网站后将使用的服务器.虽然我正在开发,但我希望只使用webrick,因为我习惯使用rails.有没有办法配置webrick以在rails中提供适当的http标头?
如何在以下脚本中添加超时?我希望它将文本显示为"超时".
var bustcachevar = 1 //bust potential caching of external pages after initial request? (1=yes, 0=no)
var loadedobjects = ""
var rootdomain = "http://" + window.location.hostname
var bustcacheparameter = ""
function ajaxpage(url, containerid) {
var page_request = false
if (window.XMLHttpRequest) // if Mozilla, Safari etc
page_request = new XMLHttpRequest()
else if (window.ActiveXObject) { // if IE
try {
page_request = new ActiveXObject("Msxml2.XMLHTTP")
} catch (e) {
try {
page_request = new ActiveXObject("Microsoft.XMLHTTP")
} catch (e) {}
}
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试调用包含jQuery代码的函数.我希望这个函数返回jQuery语句的结果.它没有用,我正在试图找出原因.
function showGetResult (name) {
var scriptURL = "somefile.php?name=" + name;
return $.get(scriptURL, {}, function(data) { return data; });
}
alert (showGetResult("John"));
Run Code Online (Sandbox Code Playgroud)
警报显示" [object XMLHttpRequest]." 但是,如果我在函数之外单独运行jQuery语句,它可以正常工作 - >$.get(scriptURL, {}, function(data) { alert(data); })
我希望能够通过将其放在返回$.get数据的函数内来重用此代码.我在这里犯了什么根本错误?
在IE 8/9中不存在FormData,但我需要在这些浏览器中使用该功能.这有一个很好的后备吗?
我会尝试发送json数据,但我需要将文件传递给服务器.我将此文件附加到formData现代浏览器中,只需提交XHR请求即可.因为FormData在IE 8/9中不存在,这显然是失败的.
// I cant seem to get this to work with a file.
$.ajax({
url: '/genericHandlers/UploadDocsFile.ashx',
type: "POST",
data: model.toJSON(),
contentType: 'application/json'
}).done(function (data) {
log('stuff happened!');
});
Run Code Online (Sandbox Code Playgroud)
也许另一种方法是在js中创建一个假的表单对象然后将数据附加到那个?
要旨:
我有一个页面使用标签加载来自s3(HTML img标签)的图像,我有一个使用的页面xmlhttprequest.标记加载在没有CORS头的情况下被缓存,因此xmlhttprequest看到缓存版本,检查它的标题并失败并发生交叉原始错误.
细节:
编辑:safari 5.1.6和chrome 21.0.1180.89都失败.在Firefox 14中正常工作.
使用S3的新CORS,我设置CORSRule如下:
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>HEAD</AllowedMethod>
<MaxAgeSeconds>0</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
Run Code Online (Sandbox Code Playgroud)
如果我在没有在请求标头中设置原点的情况下从S3请求图像,我会在响应中返回没有任何CORS标头的图像.
这个get的缓存和随后的CORS请求(一个在请求头中设置起源的请求)被拒绝,因为浏览器使用非CORS版本形成缓存.
解决这个问题的最佳方法是什么?我可以设置一些东西,以便非CORS版本永远不会被缓存吗?我应该通过将a附加?some_flag到请求的URL来区分CORS请求吗?
理想情况下,即使请求不包含"origin",我也总是会发回所需的CORS头.
我有XMLHttpRequest()以下功能
var searchFriendRequests = function (userid) {
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://localhost:6344/api/Registeration/searchFriendrequests?userid=' + userid, false);
xhr.setRequestHeader("Content-Type", "text/xml");
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
var data = xhr.responseText;
}
}
};
xhr.send(null);
}
Run Code Online (Sandbox Code Playgroud)
其中xhr.responseText返回值为
{
"$id": "1",
"ContentEncoding": null,
"ContentType": null,
"Data": [
{
"$id": "2",
"email": "anu@gmail.com"
},
{
"$id": "3",
"email": "anu@gmail.com"
}
],
"JsonRequestBehavior": 1,
"MaxJsonLength": null,
"RecursionLimit": null
}
Run Code Online (Sandbox Code Playgroud)
我如何从中获得该Data领域 …
如果我离开$ .ajax()请求中间的页面,则会触发错误回调.我已经在Safari和FF中测试了GET和POST请求.
一个可能的解决方案是在页面卸载时中止所有AJAX请求,但是在卸载之前调用错误处理程序,所以这似乎不可能.
我希望能够通过礼貌警报或模态对话框在客户端优雅地处理诸如500s之类的REAL错误,但我不希望在用户离开页面时调用此处理.
我该怎么做呢?
-
(也很奇怪:当离开页面时,错误处理程序说textStatus参数是"错误",与接收500 /错误请求时抛出相同.)
我正在使用MSXML的XmlHttpRequest对象发出请求:
IXMLHttpRequest http = new XmlHttpRequest();
http.open("GET", "http://www.bankofcanada.ca/stat/fx-xml.xml", False, "", "");
http.send();
Run Code Online (Sandbox Code Playgroud)
并且send成功了,我得到了我的xml数据.
除了XmlHttpRequest实际上没有打网络(我可以看到没有发出实际的http请求).并且Process Monitor显示文件实际上是从我的缓存中提供的:

所以我想指示XmlHttpRequest用户代理任何超过0秒的缓存内容都太旧了.执行此操作的标准方法是添加请求标头:
Cache-Control: max-age=0
Run Code Online (Sandbox Code Playgroud)
发送请求:
http = new XmlHttpRequest();
http.open("GET", "http://www.bankofcanada.ca/stat/fx-xml.xml", False, "", "");
http.setRequestHeader("Cache-Control", "max-age=0");
http.send();
Run Code Online (Sandbox Code Playgroud)
并且send成功了,我得到了我的xml数据.
除了XmlHttpRequest实际上没有打网络(我可以看到没有发出实际的http请求).Process Monitor显示文件实际上是从我的缓存中提供的.
那有什么不对?是max-age不是在做什么我想它呢?
来自RFC 2616 - 超文本传输协议,第14部分:标题字段定义:
其他指令允许用户代理修改基本过期机制.可以在请求中指定这些指令:
max-age
表示客户端愿意接受年龄不大于指定时间(秒)的响应.除非还包括最大指令,否则客户不愿意接受陈旧的响应.
这正是我想要的.
是Cache-Control: max-age=0不是我想要的,或者是MSXML的XmlHttpRequest对象错误?
这是MSXML XmlHttpRequestCOM对象:
该max-age指令由客户端添加,以供所有要遵守的缓存使用.来自RFC:
Cache-Control通用头字段用于指定请求/响应链中的所有缓存机制必须遵守的指令 …
我有一个在Windows Server 2012上运行的经典ASP网站.一个页面使用以下代码通过https向另一个应用程序发出HTTP请求:
Sub ShopXML4http(url, inStr, outStr, method, xmlerror)
Dim objhttp
Set objhttp = Server.CreateObject ("MSXML2.ServerXMLHTTP.6.0")
objHttp.open method, url, false
If Method="POST" Then
objHttp.Send instr
Else
objHttp.Send
End if
outstr=objHttp.responseText
Set objhttp=nothing
End Sub
Run Code Online (Sandbox Code Playgroud)
这段代码几乎在所有时间都可以正常工作(每天数千个请求),但偶尔会出现这样的消息:
编号:-2147012739
说明:安全通道支持发生错误
来源:msxml6.dll
该应用程序最近从旧的Windows 2003 Server迁移到2012 Server,这个问题在旧服务器上似乎永远不会出现问题.此外,虽然这个错误发生在网站上,我可以在VBScript中运行完全相同的代码,它工作正常.重置应用程序池似乎导致站点能够再次执行安全HTTP请求(尽管它经常在我到达服务器之前修复自己).
xmlhttprequest ×10
javascript ×4
ajax ×3
jquery ×3
cors ×2
amazon-s3 ×1
asp-classic ×1
caching ×1
fileapi ×1
iis ×1
msxml ×1
timeout ×1
webrick ×1