【发布时间】:2016-02-22 03:37:46
【问题描述】:
首先是我们的代码
let req = SignUp()
req.loginName = "abc@abc.com"
req.passWord = "xxx"
do{
let resp = try client.put(req) <---Where we had an error
} catch {
//some error handling
//.....
}
然后,当我们输入正确的信息时,一切都很好,但是当登录凭据错误时,我们原以为会收到带有正确错误消息的 401 错误,但我们没有。当我们追踪它试图找到它的起源时,我们已经将它追溯到 JsonServicClient.swift(从 Xcode 7.2 的 ServiceStack swift 插件生成),第 266 行。
public func send<T : JsonSerializable>(intoResponse:T, request:NSMutableURLRequest) throws -> T {
var response:NSURLResponse? = nil
var data = NSData()
do {
data = try NSURLConnection.sendSynchronousRequest(request, returningResponse: &response)
var error:NSError? = NSError(domain: NSURLErrorDomain, code: NSURLErrorUnknown, userInfo: nil)
if let dto = self.handleResponse(intoResponse, data: data, response: response!, error: &error) {
//^^^error here, response is null/can't be null
return dto
}
if let e = error {
throw e
}
return T()
} catch var ex as NSError? {
if let e = self.handleResponse(intoResponse, data: data, response: response!, error: &ex) {
return e
}
throw ex!
}
}
那么问题来了,如何正确使用ServiceStack swift插件来得到401错误?当服务返回 400 时,一切正常。此问题仅在 servicestack 服务器 api 返回 401 时发生。按照设计,我们应该在用户身份验证失败时返回 401。
【问题讨论】:
-
奇怪,标记行上的响应不应该是
nil,但它应该在catch块中失败。 -
@Sulthan 然而,这就是我们现在所见证的。我猜生成的 JsonServiceClient.swift 代码一定有问题。错误处理不起作用。
-
错误处理程序中的代码显然是错误的。它还使用在 iOS 9 (
sendSynchronousRequest) 上弃用的 API。生成的代码总是有点风险。 -
JsonServiceClient.swift 代码是从远程源拉进来的,不是生成的。仅生成客户端 DTO(由 ServiceStack 服务器生成并在本地提取)。 JsonServiceClient 的代码在 GH 上。 github.com/ServiceStack/ServiceStack.Swift/blob/master/dist/… 。与
SignUpdto 关联的路由是否需要身份验证?你能显示相关的.NET服务代码吗? -
@Layoric 对不起这个例子,注册真的不是一个好名字,想象我们正在处理登录,用户输入用户名和密码,应用程序将它用json发布到用servicestack编写的api。在 api 中,我们只是放置了一些标准验证,将密码与 db 中的哈希值进行比较等,当发生错误时,我们只是抛出一个错误。像这样: throw new AuthenticationException("password error something");
标签: swift servicestack