【问题标题】:Debugging an API request调试 API 请求
【发布时间】:2016-03-08 05:59:03
【问题描述】:

我正在尝试向 Goodreads API 发布用户状态更新。

大多数时候我的请求返回 200 OK 并且什么也不做。但是,它时不时地返回 201 Created 并更新状态。当它工作时,它总是我在 iOS 模拟器中运行应用程序后第一次尝试拨打电话。后续调用永远不会起作用。

我认为问题不在于 API 本身,因为官方的 Goodreads iOS 应用使用相同的调用并且它始终有效。

他们的 API 因在参数中包含括号的调用存在问题而闻名,但我可以进行其他包含括号的调用并且它们工作正常,问题只是这个。

我正在使用 OAuthSwift,这是我的代码:

    oAuth.client.post(
        "http://www.goodreads.com/user_status",//.xml",//?user_status[book_id]=6366035&user_status[page]=168",
        parameters: ["user_status[page]" : 168, "user_status[book_id]" : 6366035, "format" : "xml"],
        //headers: ["Content-Type" : "application/x-www-form-urlencoded"],
        success: {
            data, response in
            print("")
            print(response)
        },
        failure: {
            error in
            print("")
            print(error)
        }
    )

(注释掉的部分是我尝试失败的替代方案。)

我正在打印得到签名的基本字符串,它对于有效的调用和无效的调用看起来是一样的,除了 noncetimestamp,显然。

在标头中还包含oauth_signature,它每次都会更改,有时包含由 OAuthSwift 编码的字符,因此这可能会导致调用在某些时候工作(它只能在签名不工作时工作) '不包含某个字符)......但我也在打印标题,我没有看到任何模式或任何有效调用的标题和不正常调用的标题之间的任何可辨别的区别。

所以现在我不知道要测试什么了……我正在检查基本字符串和标头,以查找有效的调用和无效的调用,它们看起来一样……有人能想到其他改变吗在通话之间,我应该检查吗?我不知道是什么原因造成的,也不知道如何调试它。

提前致谢,

丹尼尔


编辑:很奇怪……我用 Paw、Mac REST 客户端和 Chrome 的 Postman 扩展尝试了我的请求。如果我使用 https,我第一次调用时得到 404,第二次调用 201,第三次调用 404,第四次调用 201,依此类推。它每隔一段时间工作一次。无论我使用http还是https,它的工作时间都没有关系,只要之前有一个失败的https请求,它就可以工作。

所以我尝试在我的应用中做同样的事情:我一个接一个地添加了两个 https 调用……在我的应用中它们总是返回 404。

所以看起来 Postman、Paw 和 OAuthSwift 处理请求的方式不同。我不知道这些客户端之间可能有什么区别……签名基本字符串似乎对所有三个都是相同的,标题也是……那么它们之间还有什么变化?

【问题讨论】:

  • 关于客户端的区别。 Paw 只会发送您定义的标题。在邮递员中,如果您检查发送的原始 HTTP(使用 charles 代理),则会发送许多额外的标头,这就是为什么在 Paw 中我们编写了自己的自定义 HTTP 库以确保您编写的内容正是我们发送的内容。 paw.cloud/docs/advanced/http-libraries

标签: ios swift api rest oauth


【解决方案1】:

在较新版本的 Xcode 中,您只能与 HTTPS 服务器通信。我希望 Google 支持,这样您就可以更改 URL。或者您可以编辑您的 Info.plist 文件。

应用传输安全设置 > 允许任意加载 > 是

【讨论】:

  • 我已经在我的应用程序传输安全设置中将 Goodreads 设置为异常域……现在我还将 Allow Arbitrary Loads 设置为 YES,但它仍然不起作用。 :/ 另外我不认为这会导致请求在某些时候有效,对吧?
  • 如果您尝试通过构建完整的 URL 并在浏览器中运行来手动调用它会发生什么?每次都有效吗?这应该确认查询是正确的。我看到的另一个问题是 iOS 缓存查询。它似乎有大约 20 秒的缓存(我在我创建的实时聊天应用程序中看到了这一点)。我必须通过添加一个每次随机/不同的额外变量来使调用独一无二。
猜你喜欢
  • 1970-01-01
  • 2022-11-28
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
  • 2014-03-01
  • 1970-01-01
相关资源
最近更新 更多