是否有一种无插件的方式通过jQuery(或没有)检索查询字符串值?
如果是这样,怎么样?如果没有,是否有插件可以这样做?
我有一个ASP.NET Web API(版本4)REST服务,我需要传递一个整数数组.
这是我的行动方法:
public IEnumerable<Category> GetCategories(int[] categoryIds){
// code to retrieve categories from database
}
Run Code Online (Sandbox Code Playgroud)
这是我尝试过的URL:
/Categories?categoryids=1,2,3,4
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用新的Fetch API:https://developer.mozilla.org/en/docs/Web/API/Fetch_API
我正在做这样的GET请求:
var request = new Request({
url: 'http://myapi.com/orders',
method: 'GET'
});
fetch(request);
Run Code Online (Sandbox Code Playgroud)
但是,我不确定如何将查询字符串添加到GET请求.理想情况下,我希望能够向以下URL发出GET请求:
'http://myapi.com/orders?order_id=1'
Run Code Online (Sandbox Code Playgroud)
在jQuery中,我可以通过传递做到这一点{order_id: 1}
作为data
参数$.ajax()
.使用新的Fetch API有没有相同的方法呢?
我一直在谷歌搜索来回阅读RFC和SO试图解决这个问题,但我仍然没有得到杰克.
所以我想我们只是投票给"最好的"答案就是这样,或者?
基本上它归结为这个.
3.4.查询组件
查询组件是要由资源解释的信息字符串.
query = *uric
在查询组件中,保留字符";","/","?",":","@","&","=","+",","和"$".
让我感到困惑的第一件事就是*uric就是这样定义的
uric = reserved | unreserved | escaped
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
然而,有些段落澄清了这一点
上面的"保留"语法类指的是URI中允许的那些字符,但在通用URI语法的特定组件中可能不允许这些字符; 它们用作第3节中描述的组件的分隔符.
"保留"集中的字符不会在所有上下文中保留.实际上在任何给定URI组件中保留的字符集由该组件定义.通常,如果URI的语义在其转义为US-ASCII编码时被替换,则保留字符.
最后一段摘录感觉有些倒退,但它清楚地说明保留的字符集取决于上下文.然而,3.4声明所有保留字符都在查询组件中保留,但是,这里唯一会改变语义的是逃避问号(?),因为URI没有定义查询字符串的概念.
在这一点上,我完全放弃了RFC,但发现RFC 1738特别有趣.
HTTP URL采用以下形式:
http://<host>:<port>/<path>?<searchpart>
在<path>和<searchpart>组件中,"/",";","?" 保留.可以在HTTP内使用"/"字符来指定分层结构.
我至少对RFC 1738取代RFC 2396的HTTP URL进行了解释.因为URI查询没有查询字符串的概念,所以对reserved的解释实际上并不允许我定义查询字符串,因为我习惯了现在做.
当我想将一个数字列表与另一个资源的请求一起传递时,这一切都开始了.我没有想太多,只是将它作为逗号分隔值传递给它.令我惊讶的是,逗号被逃脱了.page.html?q=1,2,3
编码的查询变成了page.html?q=1%2C2%2C3
它可以工作,但它很难看,并没有想到它.那是我开始浏览RFC的时候.
我的第一个问题很简单,编码逗号是否真的有必要?
根据RFC 2396,我的答案是:是的,根据RFC 1738:没有
后来我找到了有关请求之间传递列表的相关帖子.csv方法被认为是坏的.这显示出来了(之前没见过).
page.html?q=1;q=2;q=3
Run Code Online (Sandbox Code Playgroud)
我的第二个问题,这是一个有效的URL吗?
根据RFC 2396,我的回答是:不,根据RFC 1738:否(;保留)
我没有任何关于传递csv的问题,只要它的数字,但是你确实遇到了如果其他东西突然需要逗号来回来回编码和解码值的风险.无论如何,我尝试使用ASP.NET的分号查询字符串,结果不是我所期望的.
Default.aspx?a=1;a=2&b=1&a=3
Request.QueryString["a"] = "1;a=2,3"
Request.QueryString["b"] = "1"
Run Code Online (Sandbox Code Playgroud)
我没有看到这与csv方法有很大不同,因为当我要求"a"时,我得到一个带逗号的字符串.ASP.NET肯定不是一个参考实现,但它还没有让我失望. …
我正在使用ajax提交包含数组,文本字段和文件的多部分表单.
我将每个VAR附加到主数据上
var attachments = document.getElementById('files');
var data= new FormData();
for (i=0; i< attachments.files.length; i++){
data.append('file', attachments.files[i]);
console.log(attachments.files[i]);
data.append ('headline', headline);
data.append ('article', article);
data.append ('arr', arr);
data.append ('tag', tag);
Run Code Online (Sandbox Code Playgroud)
然后我使用ajax函数将其发送到PHP文件以存储在sql DB中.
$.ajax({
type: "post",
url: 'php/submittionform.php',
cache: false,
processData: false,
contentType: false,
data: data,
success: function(request) {$('#box').html(request); }
})
Run Code Online (Sandbox Code Playgroud)
但在PHP方面,arr
变量(即数组)显示为字符串.
当我不使用ajax作为表单数据发送它但使用简单$.POST
选项时我会在PHP端将其作为数组获取,但是我也无法发送文件.
任何解决方案
我有一个ASP.net MVC控制器调用Designs
,具有以下签名的操作:
public ActionResult Multiple(int[] ids)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用url导航到此操作时:
http://localhost:54119/Designs/Multiple?ids=24041,24117
Run Code Online (Sandbox Code Playgroud)
该ids
参数始终为null.有没有办法让MVC将?ids=
URL查询参数转换为动作的数组?我已经看到过使用动作过滤器的讨论,但据我所知,这只适用于在请求数据中而不是在URL本身中传递数组的POST.
我的要求如下:
我想给演员姓名,开始日期,结束日期,并获得他在那个时期演出的所有电影.
出于这个原因,我的服务请求是这样的.
http://localhost:8080/MovieDB/GetJson?name=Actor&startDate=20120101&endDate=20120505
Run Code Online (Sandbox Code Playgroud)
现在,我想改进它.我想给出开始日期,结束日期和多个演员姓名,并希望在那段时间内看到所有演员电影.
我不确定我的网址应该如何支持这样的事情.
我正在使用spring编写基于java的Web服务.
下面的代码是支持一个actor
@RequestMapping(value = "/GetJson", method = RequestMethod.GET)
public void getJson(@RequestParam("name") String ticker, @RequestParam("startDate") String startDate, @RequestParam("endDate") String endDate) {
//code to get results from db for those params.
}
Run Code Online (Sandbox Code Playgroud)
我想的一个解决方案是使用%符号来分隔演员姓名.例如:
http://localhost:8080/MovieDB/GetJson?name=Actor1%Actor2%Actor3&startDate=20120101&endDate=20120505
Run Code Online (Sandbox Code Playgroud)
现在,在控制器中,我将使用%解析名称字符串并获取所有actor名称.
这是一个很好的方法吗?还是有标准方法?
谢谢
我正在尝试使用urllib.urlencode对python中的字典进行urlencode.问题是,我必须编码一个数组.
结果必须是:
criterias%5B%5D=member&criterias%5B%5D=issue
#unquoted: criterias[]=member&criterias[]=issue
Run Code Online (Sandbox Code Playgroud)
但我得到的结果是:
criterias=%5B%27member%27%2C+%27issue%27%5D
#unquoted: criterias=['member',+'issue']
Run Code Online (Sandbox Code Playgroud)
我尝试过几件事,但似乎无法得到正确的结果.
import urllib
criterias = ['member', 'issue']
params = {
'criterias[]': criterias,
}
print urllib.urlencode(params)
Run Code Online (Sandbox Code Playgroud)
如果我cgi.parse_qs
用来解码一个正确的查询字符串,我得到这个结果:
{'criterias[]': ['member', 'issue']}
Run Code Online (Sandbox Code Playgroud)
但如果我对该结果进行编码,则会得到错误的结果.有没有办法产生预期的结果?
如果您的表单包含具有重复name
属性的文本输入,并且表单已发布,您是否仍然可以从$_POST
PHP中获取数组中所有字段的值?
我们在内部构建API,并且经常传递具有多个值的参数.
他们使用:mysite.com?id = 1&id = 2&id = 3
而不是:mysite.com?id = 1,2,3
我赞成第二种方法,但我很好奇第一种方法实际上是不正确的吗?
javascript ×3
url ×3
arrays ×2
query-string ×2
ajax ×1
c# ×1
fetch-api ×1
form-data ×1
http ×1
java ×1
php ×1
plugins ×1
post ×1
python ×1
rest ×1
spring ×1
spring-mvc ×1
standards ×1
uri ×1
web-services ×1