【发布时间】: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)
}
)
(注释掉的部分是我尝试失败的替代方案。)
我正在打印得到签名的基本字符串,它对于有效的调用和无效的调用看起来是一样的,除了 nonce 和 timestamp,显然。
在标头中还包含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