servicestack,Swift,servicestack" /> servicestack,Swift,servicestack" />

如何从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 
    }