繁体   English   中英

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

[英]How do I send a parameter containing a slash in GET request, via jQuery's .ajax() method?

我需要创建以下URL来通过jQuery的.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不接受请求。 我也尝试过只保留format参数,但是却收到500个服务器错误。 如果我只是将其输入到Web浏览器中,则该请求可以完美地工作,但是如果此参数丢失或不包含斜杠(无法转义),则该请求不能完美运行。 我需要防止.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提交format=application/json ,或者我应该使用另一个相似的函数代替吗?

谢谢你的帮助!

使用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参数

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM