【问题标题】:ajax post - I want to change the Accept-Encoding header valueajax post - 我想更改 Accept-Encoding 标头值
【发布时间】:2011-12-20 19:07:18
【问题描述】:

我正在使用 jQuery ajax 通过 HTTP POST 调用我的 WCF 服务。响应是 GZIP 编码的,这会导致我的环境出现问题。 (见this question)。如果响应不是 GZIP 编码的,一切都很好。

所以在 Fiddler 中查看,我看到 jQuery 生成的查询具有以下标题:

Accept-Encoding: gzip,deflate,sdch

如果我通过 fiddler 将此值更改为 None,则响应不会被压缩,这正是我想要的。我需要做的就是更改“Accept-Encoding”标头中的值。

似乎无法通过.ajax 命令更改此标头值。 (见this forum post)。

谁能告诉我有哪些选项可以更改此标头值。

这是我目前的尝试。我的headers 参数似乎被忽略了。

    $telerik.$.ajaxSetup({
        accepts: 'application/json, text/javascript, */*'
    });

    var parameters = {
        "playerId": args.playerId
    };

    var dataInJsonFormat = '{ "playerId": ' + args.playerId + '}';

    var ajaxCallParameters = {
        accepts: 'application/json, text/javascript, */*',
        async: true,
        cache: false,
        contentType: "application/json; charset=utf-8",
        url: "../Services/CmsWebService.svc/SendUpdateRequestToPlayer",
        headers: { "Accept-Encoding" : "None" },
        type: "POST",
        data: dataInJsonFormat,
        dataType: 'json',
        error: function (jqXHR, textStatus, errorThrown) {
            var errorString = 'Error thrown from ajax call: ' + textStatus + 'Error: ' + errorThrown;
            var displayPanel = document.getElementById('requestStatusUpdateResults');
            $telerik.$(displayPanel).text(errorString);

        },
        success: function (data, textStatus, jqXHR) {
            var displayPanel = document.getElementById('requestStatusUpdateResults');
            $telerik.$(displayPanel).text(data.d);
        }
    };

    $telerik.$.ajax(ajaxCallParameters);

【问题讨论】:

标签: jquery ajax wcf header


【解决方案1】:

此值可能会在此过程的后期被覆盖。

参考:http://api.jquery.com/jQuery.ajax/
标头(默认值:{})描述
类型:PlainObject
与请求一起发送的附加标头键/值对的对象。 此设置在调用 beforeSend 函数之前设置;因此,headers 设置中的任何值都可以在 beforeSend 函数中被覆盖

尝试实现beforeSend,如下面的演示代码所示,标头值现在应该到达最终请求(手指交叉)。

var ajaxParams = {
    accepts: 'text/html',
    async: true,
    cache: false,
    contentType: 'text/html',
    url: 'http://www.google.com',
    type: 'GET',
    beforeSend: function (jqXHR) {
        // set request headers here rather than in the ajax 'headers' object
        jqXHR.setRequestHeader('Accept-Encoding', 'deflate');
    },
    success: function (data, textStatus, jqXHR) {
        console.log('Yay!');
    },
    error: function (jqXHR, textStatus, errorThrown) {
        console.log('Oh no!');
    },
    complete: function (jqXHR, textStatus) {
        console.log(textStatus);
        console.log(jqXHR.status);
        console.log(jqXHR.responseText);
    }
};

$.ajax(ajaxParams);

【讨论】:

    【解决方案2】:

    这是不可能的,因为浏览器选择了正确的编码类型。 如果你这样做

    var ajaxParams = {
    accepts: 'text/html',
    async: true,
    cache: false,
    contentType: 'text/html',
    url: 'http://www.google.com',
    type: 'GET',
    beforeSend: function (jqXHR) {
        // set request headers here rather than in the ajax 'headers' object
        jqXHR.setRequestHeader('Accept-Encoding', 'deflate');
    },......
    

    你会看到这个错误:

    Refused to set unsafe header "Accept-Encoding"
    

    参考:App Engine Accept-Encoding

    【讨论】:

      【解决方案3】:

      我不确定“无”是否是一个有效的选项。我相信如果您将标头设置为接受编码“放气”而不是“无”,那应该可以解决您的问题。

      例如

      headers: { 'Accept-Encoding' : 'deflate' }
      

      【讨论】:

      • 感谢您的回答,但这实际上不是问题所在。问题是我无法将“Accept-Encoding”值更改为任何值,既不是“none”也不是“deflate”。
      • 啊,我明白了。我更长的答案应该会有所帮助。
      猜你喜欢
      • 1970-01-01
      • 2015-04-20
      • 2013-05-14
      • 2012-06-18
      • 1970-01-01
      • 2016-12-22
      • 2013-09-12
      • 1970-01-01
      • 2020-01-18
      相关资源
      最近更新 更多