如何从servicestack swift客户端获取401错误?
首先是我们的代码如何从servicestack swift客户端获取401错误?,swift,
servicestack,Swift,
servicestack,首先是我们的代码 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 //..... } let req=SignUp() req.loginName=”abc@abc.com" req.
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
//.....
}
let req=SignUp()
req.loginName=”abc@abc.com"
req.passWord=“xxx”
做{
let resp=try client.put(req)这是Swift中的一个错误,它使我们无法确定服务器错误响应是什么。我为这个问题添加了一个修复程序,现在它将抛出一个未知错误,而不是segfaulting,但由于Swift不返回HTTP响应,我们无法查询它以返回有关错误的更多信息,例如:
do {
try client.post(request)
} catch let responseError as NSError {
//Swift Bug: 401 returns an unitialized response so status is nil
if let status:ResponseStatus = responseError.convertUserInfo() {
}
}
要获取最新版本,您可以替换为最新版本,也可以删除JsonServiceClient.swift
,并添加/删除将下载最新版本的新服务参考
如果可以,您还可以切换到使用异步API,而该API没有此问题:
client.postAsync(request)
.error { responseError in
let status:ResponseStatus = responseError.convertUserInfo()!
status.errorCode //= Unauthorized
}
奇怪的是,在标记行上的响应不应该是nil
,但是它应该在catch
块中失败。@Sulthan但这是我们现在看到的。我猜生成的JsonServiceClient.swift代码一定有问题。错误处理程序不起作用。错误处理程序中的代码显然是错误的。它还使用iOS 9上不推荐使用的API(sendSynchronousRequest
)。生成的代码总是有点风险。JsonServiceClient.swift代码是从远程源拉入的,而不是生成的。仅生成客户端DTO(由ServiceStack服务器生成并在本地拉入).JsonServiceClient的代码在GH上..与注册相关联的路由是否需要身份验证?你能显示相关的.NET服务代码吗?@Layric抱歉,举个例子,注册并不是一个好名字,想象一下我们正在处理登录,用户在其中输入用户名和密码,应用程序用json将其发布到使用servicestack编写的api。在api中,我们只是放置一些标准验证,将密码与数据库中的哈希值进行比较,等等,当发生错误时,我们只是抛出一个错误。例如:抛出新的AuthenticationException(“密码错误”);这个catch
处理程序真的很奇怪,它也会强制展开response
,尽管在大多数情况下response
会是nil
。你确定这是正确的吗?如果response=nil,它永远不会到达强制展开,这是更改点。catch处理未知错误,而不是nil,也不会unwrapI不是在谈论更改,我是指原始的catch处理程序catch var ex as NSError?{
哪一个是展开响应!
在第一行。这似乎不对。你试过了吗?它不是展开响应,而是处理抛出的未知NSError。听起来你对用于捕获NSError的操作符感到困惑-这不是展开,而是捕获/处理错误可以转换为NSError
。谢谢。我们正在测试。结果如下。使用sync post时发生的错误已经消失,但我们仍然无法得到401错误。当然,这是一个快速的问题,因此仍在等待苹果处理(我们通知过苹果吗?)我们正在测试postasync,看看我们是否可以使用它。一个请求是我们是否可以被引导到一个页面,在那里我们可以找到这些方法的所有正确用法。像postasync一样,现在我们通过您的测试用例了解如何使用它。。。
client.postAsync(request)
.error { responseError in
let status:ResponseStatus = responseError.convertUserInfo()!
status.errorCode //= Unauthorized
}