是否有通过查询字符串传递数组的标准方法?
为了清楚起见,我有一个包含多个值的查询字符串,其中一个值是数组值.我希望将查询字符串值视为数组 - 我不希望数组被展开,以便它与其他查询字符串变量无法区分.
此外,根据这篇帖子的答案,作者建议不定义对数组的查询字符串支持.这准确吗?
编辑:
基于@Alex的回答,没有标准的方法可以做到这一点,所以我的后续工作是什么是一种简单的方法来识别我正在阅读的参数是PHP和Javascript中的数组?
将多个参数命名为同名是否可以接受,这样我知道它们属于一个数组?例:
?myarray=value1&myarray=value2&myarray=value3...
Run Code Online (Sandbox Code Playgroud)
或者这是不好的做法?
我想为我的Facebook OAuth2集成提供动态重定向网址.例如,如果我的Facebook应用程序中的重定向URL是这样的:
http://www.mysite.com/oauth_callback?foo=bar
我希望特定请求的重定向URL是这样的,所以在服务器上,我有一些关于如何处理身份验证代码的上下文:
http://www.mysite.com/oauth_callback?foo=bar&user=6234
在提交授权对话框后,我的重定向被调用,然后我返回一个身份验证代码,但是当我尝试获取访问令牌时,我从Facebook收到OAuthException错误.我的请求看起来像这样(为了清晰起见,添加了换行符):
https://graph.facebook.com/oauth/access_token
?client_id=MY_CLIENT_ID
&redirect_uri=http%3A%2F%2Fwww.mysite.com%2Foauth_callback%3Ffoo%3Dbar%26user%3D6234
&client_secret=MY_SECRET
&code=RECEIVED_CODE
我的所有参数都是URL编码的,代码看起来有效,所以我唯一的猜测是问题参数是我的redirect_uri.我尝试过设置redirect_uri以下所有内容,但无济于事:
code参数是否支持自定义重定向URI参数?如果是这样,我是否正确指定它们?如果没有,我会被迫设置一个cookie,还是有一些更好的模式来为我的网站提供上下文?
在ASP.NET MVC中调试时,我没有看到以下区别:
http://mysite.com?q=hi,bye
Run Code Online (Sandbox Code Playgroud)
和
http://mysite.com?q=hi%2Cbye
Run Code Online (Sandbox Code Playgroud)
查询字符串参数"q"的值始终为"hi,bye".
那么为什么逗号编码?
我想做这样的事情/sf/answers/52647661/.
我有这样的形式:
<form method="GET" action="/Search">
<input type="hidden" name="q" value="hi,bye"/>
<input type="submit" value="ok"/>
</form>
Run Code Online (Sandbox Code Playgroud)
如何防止此值被编码?
我一直在阅读$ ! ; . ,网址中的"保留"字符.但我找不到他们保留的内容.
/ path delimiter
: port
? query
& glue get params
= param=val
\# link anchor
+ space
Run Code Online (Sandbox Code Playgroud)
.
我的specific问题:
有谁知道$ ! ; . ,用于什么?
是否:有请求的URI什么特殊的意义?
我有一个WebAPI动作,如下所示:
[Route("api/values/{id}")]
public async Task<HttpResponseMessage> Delete(string id, DateTimeOffset date) {
//do stuff
}
Run Code Online (Sandbox Code Playgroud)
但是当我从一个HttpClient实例调用它时,创建一个如下的URL:
string.Format("http://localhost:1234/api/values/1?date={0}", System.Net.WebUtility.UrlEncode(DateTimeOffset.Now.ToString()));
// -> "http://localhost:1234/api/values/1?date=17%2F02%2F2015+7%3A18%3A39+AM+%2B11%3A00"
Run Code Online (Sandbox Code Playgroud)
我得到一个400回复,说date不可存在的参数不存在.
我也尝试将该[FromUri]属性添加到参数中,但它仍然没有映射.如果我将其更改为DateTimeOffset?我可以看到它保留为null并且查看Request.RequestUri.Query值是否存在,只是没有映射.
最后,我尝试不做一个WebUtility.UrlEncode,它没有任何不同.
我正在寻找一种在空间方面最有效的 url 编码方法。原始二进制文件 (base2) 可以用更小的 base16 表示,并且是 url 安全的,但 base64 的效率更高。然而,通常的 base64 编码不是 url 安全的......
那么对于 URLS 来说,最小且安全的编码方式是什么呢?
我想,在 URL 查询字符串值中使用,但它是保留字符。然而,现在我们可以看到许多电子商务网站都提供了大量逗号查询字符串网址。
当我们在查询字符串中使用时我们会考虑什么,?是否应该像%2c往常一样进行编码?
请注意,我的服务器端框架是 ASP.NET WebApi、dJango 和 Node.js。
在标准 URI 查询字符串中,我是否允许=在查询组件的值部分中使用未编码的等号 ( )。换句话说,我是否允许在第一个等号之后但在&分隔组件之前的另一个等号?例如,以下有效吗?
index.html?param1=a_value_with_=_sign¶m2=12=13
从我阅读什么是有效的,什么不在 URI 查询中?,它总结了 RFC 3986,在组件中使用 equals不会“与保留字符作为分隔符的用途相冲突”,因为在这种情况下很明显,只有每个组件中的第一个 equals 用作分隔符。所以我认为我应该能够做到这一点。
我正在尝试添加项目列表作为请求参数。当我手动编写这样的 URL 时:http://localhost:8080/api/user/book/?keyword=&page=1&pageSize=5&field=id&order=ascend&author=aziz&author=nazim,我得到了我想要的。
然而,axios 坚持毫无意义地添加方括号。
const _fetchBooks = async (params) => {
const url = `${UrlUtil.userURL()}/book/`;
const response = await axios.get(url, {
params: {
keyword: params.search,
page: params.pagination.current,
pageSize: params.pagination.pageSize,
field: params.sorter?.field,
order: params.sorter?.order,
author: params.filter?.author,
},
...
};
Run Code Online (Sandbox Code Playgroud)
这是我进行过滤时 React 尝试到达的结果 URL:
http://localhost:8080/api/user/book/?keyword=&page=1&pageSize=5&field=id&order=ascend&author[]=aziz&author[]=nazim
有了括号,我无法继续,因为我遇到了异常:
java.lang.IllegalArgumentException: Invalid character found in the request target [/api/user/book/keyword=&page=1&pageSize=5&field=id&order=ascend&author[]=aziz&author[]=nazim ]. The valid characters are defined in RFC 7230 and RFC 3986
所以,Java 不喜欢括号。
我正在寻找最简洁的URL而不是最短的PHP代码.我不希望我的用户被编码数组时PHP创建的可怕URL吓到.
如果只填充一个数组($fn),PHP将在查询字符串中执行大量重复http_build_query:
$fs = array(5, 12, 99);
$url = "http://$_SERVER[HTTP_HOST]/?" .
http_build_query(array('c' => 'asdf', 'fs' => $fs));
Run Code Online (Sandbox Code Playgroud)
结果$url是
http://example.com/?c=asdf&fs[0]=5&fs[1]=12&fs[3]=99
Run Code Online (Sandbox Code Playgroud)
如何将其降至最低(使用PHP或在PHP中轻松实现的方法)?