我在firefox上遇到ajax请求的情况,我在firebug的网络部分检查firefox的一些请求的类型,并且响应被识别为xml而不是json,得到错误的格式错误,这个chrome中不会出现错误。 我使用框架extJS并使用方法Ext.Ajax.request来进行申请。
这里是chrome的标题
POST /stricto/crsCronograma/pesquisa?_dc=1451910851660 HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 678
Pragma: no-cache
Cache-Control: no-cache
Origin: http://localhost:8080
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept: */*
Referer: http://localhost:8080/stricto/?id=desenv_Stricto-SA_7018
Accept-Encoding: gzip, deflate
Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: JSESSIONID=95519F96AD70310CE466B2164ED7A08A
和firefox
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,application/json
Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer: http://localhost:8080/stricto/?id=desenv_Stricto-SA_7018
Content-Length: 678
Cookie: JSESSIONID=5DE7F2C586F125FC590548957B486F43
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
这里是发出请求的代码
request: (function () {
/**
* Normaliza os dados de entrada
*
* @return {Object} config
*/
function processArgs() {
var defaults = {
root: 'data',
params: {}
};
if (Sharedev.util.Object.isString(arguments[0]))
return Ext.apply(defaults, {
url: arguments[0]
}, arguments[1]);
return Ext.apply(defaults, arguments[0] || {});
}
/**
* Normaliza as funções de success ou failure
*/
function processCallbacks(config) {
var onResponseSuccess = config.success;
var onResponseFailure = config.failure;
return Ext.apply(config, {
failure: Sharedev.util.Ajax.onRequestFailure,
success: Sharedev.util.Ajax.onRequestSuccess,
onResponseSuccess: onResponseSuccess || Sharedev.util.Ajax.onResponseSuccess,
onResponseFailure: onResponseFailure || Sharedev.util.Ajax.onResponseFailure
});
}
/**
* Processa os dados do record
*/
function processRecord(config) {
var record;
if (!(record = config.record || config.data))
return config;
delete config.data;
delete config.record;
if (record instanceof Ext.data.Model) {
config.model = record.self;
Ext.applyIf(config.params, Sharedev.util.Object.addPrefix(record.getData(), Sharedev.util.Class.getSimpleName(config.model, true)));
} else {
throw new Sharedev.util.Exception.IllegalArgument('A propriedade "record" esta não é uma instancia de um modelo');
}
return config;
}
function processModel(config) {
if (!config.model)
return;
var Model = config.model && Sharedev.util.Record.getModel(config.model);
if (!config.url && Model) {
var simplename = Sharedev.util.Class.getSimpleName(Model, true);
config.url = './' + simplename + '/' + Sharedev.data.Proxy.prototype.apiMethod.read;
}
Ext.applyIf(config.params, {
map: Sharedev.util.Ajax.initMapProperty(Model, true)
});
return config;
}
function processMask(config) {
if (!config.mask)
return;
var callback = config.callback;
var msg, target;
if (config.mask.isComponent)
target = config.mask;
else {
target = config.mask.target;
msg = config.mask.msg;
}
Sharedev.util.LoadMask.show(target, msg);
delete config.mask;
return Ext.apply(config, {
$maskTarget: target,
$callback: callback,
callback: function (config) {
Sharedev.util.LoadMask.hide(config.$maskTarget);
if (config.$callback)
config.$callback.apply(this, arguments);
},
});
}
function processFilters(config) {
if (!config.filters)
return;
Ext.applyIf(config.params, {
filter: Sharedev.util.Ajax.initFilterProperty(config.filters)
});
delete config.filters;
return config;
}
return function () {
var config = processArgs.apply(this, arguments);
processCallbacks(config);
processRecord(config);
processModel(config);
processFilters(config);
processMask(config);
Sharedev.util.Ajax.format(config.params);
return Ext.Ajax.request(config);
};
我在服务器上使用java并且在此方法中设置了标题contntettype
public static void includeJson(Result result, String message) {
if (result.included().containsKey("message")) {
return; // so coloca a mensagem uma vez, pois se colocar mais de uma, ira concatenar erroneamente
}
result.include("message", message);// adicionado como include somente para verificar se ja foi respondido ou nao
String contenttype = "application/json";
if (result.included().containsKey("content-type")) {
contenttype = (String) result.included().get("content-type");
}
result.use(Results.http()).body(message).addHeader("content-type", contenttype);
}
答案 0 :(得分:1)
Firefox正在发送您指定的请求。您没有指定您接受的响应类型,Firefox使用在network.http.accept.default
中的about:config中设置的默认值。默认情况下,Firefox更喜欢XML而不是JSON(text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
)。如果可以的话,服务器可以根据您的浏览器的要求为该类型提供服务。
*/*
),而IE告诉服务器它更喜欢JSON。因此,虽然您的服务器确实向Chrome提供JSON,但默认情况下,.NET会将XML提供给Chrome(以及Firefox,仅将JSON发送到IE)。
简而言之,您要做的是明确定义您可以接受的返回类型:
Ext.Ajax.request({
...
headers:{
Accept:'application/json'
}
});
您将看到,一旦设置了Accept标头,只要服务器正确识别请求类型并且能够提供JSON,您就会神奇地使用JSON服务。