如何通过jQuery' s .ajax()方法在GET请求中发送包含斜杠的参数?

时间:2016-11-27 04:11:38

标签: javascript jquery json ajax

我需要创建以下URL来通过jQuery' s .ajax()函数调用API:

https://www.airnowapi.org/aq/forecast/zipCode/?format=application/json&zipCode=02144&date=2016-11-26&distance=25&API_KEY=API_KEY

我知道如何通过将字符串放在一起来形成它,但这似乎是一个不必要的解决方法,并且不允许我使用.ajax()。我必须手动完成这项功能应该为我做的很多工作。

问题在于这一部分:format=application/json,因为当我将其作为参数传递给我传递给.ajax()的设置对象时,它会将斜杠转义为%2F和API不接受请求。我也试过省略格式参数,但是我收到500服务器错误。如果我只是将其输入到我的网络浏览器中,该请求就可以正常工作,但如果缺少此参数或者不包含斜杠(无法转义),则请求无效。我需要阻止.ajax()以这种方式对斜杠进行编码,或者在它到达API服务器之前以某种方式再次对其进行解码。

我已经在Google和StackOverflow上搜索了答案,但没有运气。我理解如何对转义字符进行编码和解码,但我无法在一个我没有编写的jQuery函数中拦截它。除非我尝试重写该函数,基于jQuery源代码,但对于一个简单的问题,这似乎是一个很大的解决方法。作为参考,这是我的代码的相关部分:

function getData(query, callback) {
    var settings = {
        url: state.apis.airNow.BASE_URL,
        dataType: 'json',
        type: 'GET',
        success: callback,
        data: {
            format: "application/json",
            zipCode: query,
            distance: 25,
            API_KEY: state.apis.airNow.API_KEY
        }
    };
    $.ajax(settings);
}

如何让.ajax()以API所期望的确切形式提交format=application/json,或者我应该使用其他类似的功能?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

使用processData:false并手动构建查询字符串。值得注意的是,我的makeQS函数不会处理当前状态的嵌套对象或数组。除此之外唯一的选择是传递URL上的参数或拦截AJAX请求并更改URL

processData解决方案:

function makeQS(obj){
    var params = [];
    for(var key in obj){
        params.push(key + '=' + obj[key]);
    }
    return params.join('&');
}


function getData(query, callback) {
    var settings = {
        url: state.apis.airNow.BASE_URL,
        dataType: 'json',
        type: 'GET',
        success: callback,
        processData: false,
        data: makeQS({
            format: "application/json",
            zipCode: query,
            distance: 25,
            API_KEY: state.apis.airNow.API_KEY
        })
    };
    $.ajax(settings);
}

如果您想在URL上传递它们,您只需将settings.url更改为:

settings.url = state.apis.airNow.BASE_URL + '?' + makeQS({
            format: "application/json",
            zipCode: query,
            distance: 25,
            API_KEY: state.apis.airNow.API_KEY
        })

可能还值得注意的是,因为对&等字符的参数完全没有编码。和=在任何参数内很可能会导致API端点出现意外行为,这是此类端点通常应采用URI编码的GET参数的原因之一 `