我们正在使用以下标题发出XHR请求(我简化了一点):
POST http://localhost:9001/login
Host: localhost:9001
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0
Accept: application/json, text/plain, */*
Content-Type: application/json;charset=utf-8
Content-Length: 67
然后我们的服务器响应这样(再次简化):
Status code: 200 OK
Cache-Control: no-cache, no-store
Connection: close
Content-Length: 0
Date: Mon, 27 Feb 2017 17:19:53 GMT
Server: WildFly/9
Set-Cookie: JSESSIONID=123; path=/
响应中没有有效负载。请注意Content-Length: 0
。但Firefox仍然试图将其解析为XML。并将以下错误输出到控制台:
XML Parsing Error: no root element found
Location: http://localhost:9001/login
Line Number 1, Column 1
注意,服务器不发送content-type
标头。根据{{3}},只有在有实际内容时才需要发送content-type
标题。
这是Firefox中的一个错误还是我的研究错误?
自行复制
我写了一个小型服务器和客户端来重现这个问题。
server.js
(以node ./server.js
开头):
const fs = require('fs'), http = require('http');
const server = http.createServer(function (request, response) {
if (request.method === 'POST') {
// send empty response
response.end();
return;
}
// send file content
fs.readFile('.' + request.url, function (error, content) {
response.writeHead(200, { 'Content-Type': request.url === '/index.html' ? 'text/html' : 'text/javascript' });
response.end(content);
});
}).listen(8080);
index.html
<script src="client.js"></script>
client.js
var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://localhost:8080/login');
xhr.send();
在Firefox中打开网址RFC 7231时,JavaScript控制台会出错。
Firefox版本51.0.1
答案 0 :(得分:2)
响应中没有有效负载。注意内容长度:0
这意味着有一个有效负载,并且该有效负载的大小为0字节。将null
和""
之间的区别视为字符串。当您想要与""
等效时,这里拥有的就是null
。
将状态代码设置为204
而不是200
,以表示您不是要发送实体(并删除内容类型,因为没有内容类型就没有实体)。>
(很长时间以来,Firefox在这种情况下仍然会记录错误,但值得庆幸的是,该错误最终得以解决。即使记录了错误,它仍然可以继续正确运行任何脚本)。
答案 1 :(得分:0)
从POST请求看来,您似乎正在使用XHR / JS发送请求。
因此,可能是在处理结果的代码中出现了问题。
(此外,请求中的Content-Type不正确,application / json上没有charset参数)