我使用AFNetworking执行登录,网址格式如下:
http://xxx/mobile?function=login&req={username:xxx,password:xxx}
首先,我在NSDictionary中使用NSDictionary创建参数,如下所示:
@{@"function" : @"login",
@"req" : @{@"username" : @"xxx", @"password" : @"xxx"}}
但查询出来是错误的
function=login&req[password]=xxx&req[username]=xxx
在此之后,我使用JSONKit打包参数
NSDictionary *userInfo = @{@"userName" : [username URLEncodedString],
@"password" : [password URLEncodedString]};
NSDictionary *parameters = @{@"function" : @"login",
@"req" : [userInfo JSONString]};
结果似乎相似,但“{}”编码
function=login&req=%7B%22userName%22%3A%22xxx%22%2C%22password%22%3A%22xxx%22%7D
我哪里出错了?我该如何纠正? 非常感谢!
答案 0 :(得分:0)
这里有几个问题。
您好像担心URL部分中的转义百分比看起来像:
function=login&req=%7B%22userName%22%3A%22xxx%22%2C%22password%22%3A%22xxx%22%7D
您不应该担心这一点,因为当服务器收到它时,它会自动将其转换为:
function=login&req={"userName":"xxx","password":"xxx"}
您报告某个员工告诉您不需要转义百分比。从技术上讲,他可能是正确的(在这种情况下,只要用户名和密码没有特定的保留字符,特别是+
,&
或{{1这可能会导致网址出现问题),但根据有关网址的RFC,所有这些字符都应该被百分比转义。并且服务器将自动取消对参数的百分比转义,因此您不必担心请求被转义百分比这一事实。而且,实际上,如果您希望此界面具有健壮性,那么iOS和Android客户端实际上应该是百分比转义,您添加到URL中的值。
但看起来有问题的是,上面的示例包含双引号,而您建议服务器期待以下内容:
#
但这不是有效的JSON。有效的JSON将是:
{username:xxx,password:xxx}
那么,您是否真的相信您的Web服务需要/需要无效的JSON?如果您绝对需要无效的JSON(如果您希望继续使用此内容,我会感到震惊),您必须使用{"userName":"xxx","password":"xxx"}
手动构建它,就像任何JSON一样如果没有引号,那么在盐中值得权重的类将无法生成JSON。
我不鼓励您在网址中发送用户ID和密码信息。这代表了安全风险,这些信息很容易受到损害。您确实应该将这些身份验证详细信息放在stringWithFormat
请求的正文中,而不是POST
请求的网址中。 (而且,显然,您希望使用HTTPS,而不是HTTP。)
我还充分尊重混合GET
样式参数(x-www-form-urlencoded
和function
)的方法,然后使用JSON作为{{1 }和req
。通常,您要么使用userName
样式请求,要么使用JSON请求,但将两者结合在一起非常好奇。你可以,但它有点奇怪。
所以,底线,虽然您可以构建您描述的网址(使用password
手动执行),但我真的鼓励您重新设计您的网络服务,以便(a)接收{{1}请求正文中包含身份验证详细信息的请求; (b)使用JSON或x-www-form-urlencoded
,但您可能不想混合搭配。