标签: xmlhttprequest

XMLHttpRequest的onerror处理程序何时应该触发

理解XMLHttpRequest处理程序时遇到一些问题.规范说明了这个onerror处理程序:

error [Dispatched ...]请求失败时.

load [Dispatched ...]请求成功完成后.

问题是,"请求失败了"是什么意思.那可能是

  • 根本无法发出请求(例如,拒绝连接和此类错误),或者
  • 以上加服务器返回错误代码(例如404)

此外,我想知道它是否意味着onerror并且onload永远不应该同时开火.

此引用表示onerror应根据status代码执行处理程序并onload依赖于readyState.这表明它们并不相互排斥,但是,我不认为这是一个权威的信息.

我问,因为使用最新的Opera快照,我发现onload甚至在404状态代码上被解雇.我知道测试status是一个肯定的赌注,但我想知道这是我必须按照规范做什么,或者只是解决Opera中的错误.

javascript ajax xmlhttprequest

43
推荐指数
1
解决办法
4万
查看次数

如何在XHR onProgress函数中使用缩减/ gzipped内容?

我之前看到过一些类似的问题,但我还没有找到一个完全描述我当前问题的问题,所以这里有:

我有一个页面,通过AJAX加载一个大的(介于0.5和10 MB之间)JSON文档,以便客户端代码可以处理它.加载文件后,我没有任何我不期望的问题.但是,下载需要很长时间,因此我尝试利用XHR Progress API呈现进度条,以向用户指示文档正在加载.这很好用.

然后,为了加快速度,我尝试通过gzip和deflate压缩服务器端的输出.这也很有效,但是,我的进度条停止了工作.

我已经研究了一段时间的问题,发现如果Content-Length没有使用请求的AJAX资源发送正确的头文件,onProgress事件处理程序就无法按预期运行,因为它不知道它在下载中有多远.发生这种情况时,lengthComputablefalse在事件对象上设置一个名为call的属性.

这是有道理的,所以我尝试使用未压缩和压缩的输出长度显式设置标头.我可以验证是否正在发送标头,我可以验证我的浏览器知道如何解压缩内容.但onProgress处理程序仍然报告lengthComputable = false.

所以我的问题是:有没有办法使用AJAX Progress API来压缩/缩小内容?如果是这样,我现在做错了什么?


这是资源在Chrome网络面板中的显示方式,表明压缩正在运行:

网络面板

这些是相关的请求标头,显示请求是AJAX并且Accept-Encoding设置正确:

GET /dashboard/reports/ajax/load HTTP/1.1
Connection: keep-alive
Cache-Control: no-cache
Pragma: no-cache
Accept: application/json, text/javascript, */*; q=0.01
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.99 Safari/537.22
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Run Code Online (Sandbox Code Playgroud)

这些都是相关的响应报头,显示出Content-LengthContent-Type被正确设置:

HTTP/1.1 200 …
Run Code Online (Sandbox Code Playgroud)

javascript compression jquery xmlhttprequest

42
推荐指数
2
解决办法
2万
查看次数

http请求正文是什么意思?

在阅读有关POST的内容并获取方法时,有一个语句,例如"当使用post方法时它使用HTTP请求Body.它是什么意思"HTTP请求主体".?

html http xmlhttprequest httprequest

40
推荐指数
3
解决办法
6万
查看次数

当ajax目标是localhost时,IE 10和11中的访问被拒绝

我正在尝试在互联网上的服务器(http)之间进行ajax调用.并将其定位到我自己的localhost.FF/Chrome/ETC ......有效.它只是一个IE问题.IM使用IE 11和10.

请求甚至没有完成."拒绝访问"立即被抛出.

这是代码.只为你看.

不是IE8和IE9中的经典HTTP/HTTPS错误.这是别的,但文档没有帮助.

$jq.ajax({
            contentType: 'application/json',
            url: url,
            dataType: 'json',
            crossDomain: true,
            beforeSend: function (xhr) {
                xhr.withCredentials = true; 
                xhr.setRequestHeader("Authorization", "Basic " + $jq.base64.encode(username and password));
            },
            success: function (data, status, headers) {},
            error: function (xhr, status, error) {}
Run Code Online (Sandbox Code Playgroud)

状态是0xhr对象和错误是"拒绝访问"

ajax xmlhttprequest cors internet-explorer-10 internet-explorer-11

38
推荐指数
2
解决办法
9万
查看次数

fetch - multipart/form-data POST中缺少边界

谢谢你的光临.

我想送new FormData()body一个的POST使用请求提取API

操作看起来像这样

var formData = new FormData()
formData.append('myfile', file, 'someFileName.csv')

fetch('https://api.myapp.com', 
  {
    method: 'POST',
    headers: {
      "Content-Type": "multipart/form-data"
    },
    body: formData
  }
)
Run Code Online (Sandbox Code Playgroud)

这里的问题是边界,类似的东西

boundary=----WebKitFormBoundaryyEmKNDsBKjB7QEqu

从来没有进入Content-Type:标题

它看起来应该是这样的

Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryyEmKNDsBKjB7QEqu

当你用a尝试"相同"的操作时new XMLHttpRequest(),就像这样

var request = new XMLHttpRequest()
request.open("POST", "https://api.mything.com")
request.withCredentials = true
request.send(formData)
Run Code Online (Sandbox Code Playgroud)

标题已正确设置

Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryyEmKNDsBKjB7QEqu

所以我的问题是,

  1. 我如何使这种情况fetch完全像XMLHttpRequest

  2. 如果这不可能,为什么?

谢谢大家!这个社区或多或少是我取得职业成功的原因.

javascript xmlhttprequest form-data fetch fetch-api

38
推荐指数
6
解决办法
3万
查看次数

XmlHttpRequest onprogress间隔

我正在使用XmlHttpRequests将图像上传到服务器,我想向用户显示这些上传的进度.

不幸的是,对onprogress-event处理程序的调用之间的间隔太大.对于500k图像,通常只对onprogress调用一次或两次.

这是我的代码:

/* This function is not called often enough */
function progress(e){
    console.log('Uploading: ' + Math.round((e.loaded / e.total) * 100) + ' %');
}

var xhr = new XMLHttpRequest();
xhr.upload.addEventListener('progress', progress, false);
xhr.send(data);
Run Code Online (Sandbox Code Playgroud)

可以改变这种行为,还是在浏览器实现中将其硬编码?

javascript ajax xmlhttprequest

37
推荐指数
1
解决办法
2万
查看次数

jQuery.getJSON - Access-Control-Allow-Origin问题

我正在使用jQuery的$.getJSON()函数来返回一小段JSON数据.

我已将JSON数据放在网址上,例如example.com.我没有意识到,但是当我访问相同的URL时,无法加载JSON数据.我跟着控制台,发现XMLHttpRequest由于无法加载Access-Control-Allow-Origin.

现在,我已经读完了,很多网站只是说要使用$.getJSON(),这将是解决方法,但显然它不起作用.我应该在标题或函数中更改某些内容吗?

非常感谢帮助.

javascript jquery json xmlhttprequest access-control

37
推荐指数
2
解决办法
10万
查看次数

使用Javascript检索二进制文件内容,base64对其进行编码并使用Python对其进行反向解码

我正在尝试使用XMLHttpRequest(使用最近的Webkit)下载二进制文件,并使用这个简单的函数对其内容进行base64编码:

function getBinary(file){
    var xhr = new XMLHttpRequest();  
    xhr.open("GET", file, false);  
    xhr.overrideMimeType("text/plain; charset=x-user-defined");  
    xhr.send(null);
    return xhr.responseText;
}

function base64encode(binary) {
    return btoa(unescape(encodeURIComponent(binary)));
}

var binary = getBinary('http://some.tld/sample.pdf');
var base64encoded = base64encode(binary);
Run Code Online (Sandbox Code Playgroud)

作为旁注,上面的所有内容都是标准的Javascript内容,包括btoa()encodeURIComponent():https://developer.mozilla.org/en/DOM/window.btoa

这非常顺利,我甚至可以使用Javascript解码base64内容:

function base64decode(base64) {
    return decodeURIComponent(escape(atob(base64)));
}

var decodedBinary = base64decode(base64encoded);
decodedBinary === binary // true
Run Code Online (Sandbox Code Playgroud)

现在,我想使用Python解码base64编码的内容,它使用一些JSON字符串来获取base64encoded字符串值.天真这就是我的所作所为:

import urllib
import base64
# ... retrieving of base64 encoded string through JSON
base64 = "77+9UE5HDQ……………oaCgA="
source_contents = urllib.unquote(base64.b64decode(base64))
destination_file …
Run Code Online (Sandbox Code Playgroud)

javascript python base64 encoding xmlhttprequest

37
推荐指数
1
解决办法
6万
查看次数

RESTful HTTP API中的授权,401 WWW-Authenticate

我正在创建一个RESTful服务来为Web应用程序提供数据.我有两个相关的问题.

1.如何处理未经授权的请求?

我打算用以下代码回复请求:

  • 资源是否打开并找到?200好的
  • 您是否需要通过身份验证才能访问资源?401未经授权
  • 您是否可以访问某类资源?403禁止
  • 您是否可以访问某类资源,但不能访问此特定资源?404 Not Found阻止人们了解他们无法访问的资源的存在.
  • 资源不存在吗?404未找到

这是RESTful服务的推荐方式吗?

2. WWW-Authenticate401响应应该提供什么标题?

我在维基百科上阅读(可能不是最准确的资源,但它对我有用)401响应必须包含一个WWW-Authenticate标题,但是在进一步搜索时我找不到任何资源说明这个值意味着什么以及它应该是什么.

我找到了几个有关此标题的SO问题和论坛主题,它们似乎都是关于OAuth的,建议不要使用401状态代码或者说你可以做些什么.

此标头应包含的正确值是什么?

rest http xmlhttprequest http-status-codes http-status-code-401

37
推荐指数
1
解决办法
3万
查看次数

AJAX请求和常规浏览器请求之间的区别

AJAX请求和直接浏览器请求之间是否存在差异(就如何调用和加载网页而言)?

换句话说,我的意思是:是否以与客户端请求(由浏览器发起)不同的方式处理直接服务器端请求?

javascript ajax xmlhttprequest

36
推荐指数
2
解决办法
2万
查看次数