Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何通过jQuery';发送GET请求中包含斜杠的参数;ajax()方法?_Javascript_Jquery_Json_Ajax - Fatal编程技术网

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

Javascript 如何通过jQuery';发送GET请求中包含斜杠的参数;ajax()方法?,javascript,jquery,json,ajax,Javascript,Jquery,Json,Ajax,我需要创建以下URL以通过jQuery的.ajax()函数调用API: https://www.airnowapi.org/aq/forecast/zipCode/?format=application/json&zipCode=02144&date=2016-11-26&距离=25&API_键=API_键 我知道如何通过单独将字符串组合在一起来形成这种情况,但这似乎是一种不必要的解决方法,不允许我使用.ajax()。我必须手动完成很多工作,这个功能应该为我完成 问题在于这一部分:format=

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

https://www.airnowapi.org/aq/forecast/zipCode/?format=application/json&zipCode=02144&date=2016-11-26&距离=25&API_键=API_键

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

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

我已经在谷歌和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
,还是应该使用其他类似的函数


谢谢你的帮助

使用
processData:false
并手动构造查询字符串。值得注意的是,my
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参数的原因之一
`

问题在于,
$.ajax()
会将
数据
对象转换为要附加到url的查询字符串。这很好用…除了url编码不能与API一起使用这一事实。您能否修改设置对象的
url
参数以包含查询的格式部分?类似于
url:state.api.airNow.BASE_url+'?format=application/json',
?@SimianAngel,我想到了这一点,但如果
$.ajax()
必须对其余设置进行编码,它将在第一个参数后添加另一个“?”。不过,通过下面@Brian的回答,我应该能够解决这个问题。一旦我尝试并确保它能正常工作,我会对它做出回应,并且可能会立即投票!谢谢,布莱恩。我的网站现在正在提交正确的查询字符串和URL。API仍然不接受请求-有趣的是,当我将提交的URL剪切并粘贴到我的浏览器中时,它确实返回了预期的JSON对象,只是当它通过我的Javascript时,它不会返回-但这似乎是一个与我在这里问到的问题完全不同的问题,因此,在再次打扰任何人之前,我会先尝试一下。我建议使用Chromes network tab并比较这两个请求,看看有什么不同。如果您无法在浏览器中进行故障排除,可以尝试使用您熟悉的其他工具/语言生成请求(curl、wget或者一个节点或php脚本可能会起作用)。唯一的另一个想法是API规范是否列出了任何其他必须或不必须包含的标题或字段,或者错误是否提供了任何可能有助于故障排除的进一步信息?仅供参考,自上一篇文章以来,我解决了第二个问题。它与第一个问题无关,但显然API不支持CORS(文档中未指定任何位置)因此,我们必须从后端代理发送请求。现在一切都正常了。感谢您的帮助,Brian!非常欢迎!代理它可能对功能添加/缓存/整合等非常有用。而且它还可以防止滥用API密钥,这可能是他们不支持CORS的原因。这一点很糟糕,可能会为您节省很多时间我!很高兴你解决了这个问题-希望我的答案对任何遇到挑剔的API端点的人都有帮助:).是的,代理在任何情况下都是一个好主意。不过,我还是一名网络开发专业的学生,我们还没有涉及到后端主题。我的导师大部分都是为我做这部分的,如果他们支持CORS,这是不必要的,但我很快就会学会自己做。