使用JSONKit和AFNetworking使url查询复杂的JSON对象

时间:2014-04-03 06:04:24

标签: ios json afnetworking-2 jsonkit

我使用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

我哪里出错了?我该如何纠正? 非常感谢!

1 个答案:

答案 0 :(得分:0)

这里有几个问题。

  1. 您好像担心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中的值。

  2. 但看起来有问题的是,上面的示例包含双引号,而您建议服务器期待以下内容:

    #

    但这不是有效的JSON。有效的JSON将是:

    {username:xxx,password:xxx}
    

    那么,您是否真的相信您的Web服务需要/需要无效的JSON?如果您绝对需要无效的JSON(如果您希望继续使用此内容,我会感到震惊),您必须使用{"userName":"xxx","password":"xxx"} 手动构建它,就像任何JSON一样如果没有引号,那么在盐中值得权重的类将无法生成JSON。

  3. 我不鼓励您在网址中发送用户ID和密码信息。这代表了安全风险,这些信息很容易受到损害。您确实应该将这些身份验证详细信息放在stringWithFormat请求的正文中,而不是POST请求的网址中。 (而且,显然,您希望使用HTTPS,而不是HTTP。)

  4. 我还充分尊重混合GET样式参数(x-www-form-urlencodedfunction)的方法,然后使用JSON作为{{1 }和req。通常,您要么使用userName样式请求,要么使用JSON请求,但将两者结合在一起非常好奇。你可以,但它有点奇怪。

  5. 所以,底线,虽然您可以构建您描述的网址(使用password手动执行),但我真的鼓励您重新设计您的网络服务,以便(a)接收{{1}请求正文中包含身份验证详细信息的请求; (b)使用JSON或x-www-form-urlencoded,但您可能不想混合搭配。