0

我正在使用 AFNetworking 执行登录,并且 url 格式是这样的:

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

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

4

1 回答 1

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"}
    

    您报告说一位同事告诉您不需要百分比逃逸。从技术上讲,他可能是对的(在这种情况下,只要用户名和密码不包含某些特定的保留字符,特别是 或 ,这可能会导致 URL 出现问题,您可能会在这种情况下不使用百分比转义+&#但根据 RFC 的关于 URL,所有这些字符都应该被百分比转义。并且服务器将自动取消百分比转义参数,因此您不必担心请求被百分比转义的事实。而且,事实上,如果你希望这个接口是健壮的,iOS 和 Android 客户端都应该是像这样添加到 URL 的百分比转义值。

  2. 但是,似乎有问题的是上面的示例包含双引号,而您建议服务器期望类似:

    {username:xxx,password:xxx}
    

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

    {"userName":"xxx","password":"xxx"}
    

    那么,您真的确信您的 Web 服务需要/需要无效的 JSON 吗?如果您绝对需要无效的 JSON(如果您想这样做,我会感到震惊),您必须使用 手动构建它stringWithFormat,因为任何有价值的 JSON 类都无法生成不带引号的 JSON。

  3. 我不鼓励您在 URL 中发送用户名和密码信息。这代表了一种安全风险,这些信息很容易被泄露。您确实应该将这些身份验证详细信息放在POST请求的正文中,而不是放在请求的 URL 中GET。(而且,很明显,您希望使用 HTTPS,而不是 HTTP。)

  4. 恕我直言,我还质疑混合x-www-form-urlencoded样式参数(for functionand req)的方法,然后使用 JSON for userNameand password。通常,您要么使用x-www-form-urlencoded样式请求,要么使用 JSON 请求,但是将两者结合在一起非常奇怪。你可以,但这有点奇怪。

因此,最重要的是,虽然您可以构建您描述的 URL(使用 手动执行stringWithFormat),但我真的鼓励您重新设计您的 Web 服务以 (a) 在POST请求正文中接收带有身份验证详细信息的请求;(b) 使用 JSON 或x-www-form-urlencoded,但您可能不想混合搭配。

于 2014-04-03T13:10:00.230 回答