首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在API调用过程中从服务器获取错误信息

在API调用过程中从服务器获取错误信息
EN

Stack Overflow用户
提问于 2019-04-26 09:50:12
回答 1查看 301关注 0票数 1

我有一个应用程序,我通过扩展ObservableType将RxSwift用于我的网络,这工作得很好,但我现在遇到的问题是,当我发出API请求时出现错误,我无法显示从服务器发送的特定错误消息。现在,我如何获得从服务器发送的特定错误响应

代码语言:javascript
运行
AI代码解释
复制
extension ObservableType {

    func convert<T: EVObject>(to observableType: T.Type) -> Observable<T> where E: DataRequest {

        return self.flatMap({(request) -> Observable<T> in

            let disposable = Disposables.create {
                request.cancel()
            }

            return Observable<T>.create({observer -> Disposable in

                request.validate().responseObject { (response: DataResponse<T>) in
                                        switch response.result {
                    case .success(let value):

                        if !disposable.isDisposed {
                            observer.onNext(value)
                            observer.onCompleted()
                        }
                    case .failure(let error):

                        if !disposable.isDisposed {
                            observer.onError(NetworkingError(httpResponse: response.response,
                                                             networkData: response.data, baseError: error))
                            observer.onCompleted()
                        }

                    }
                }

                return disposable
            })

        })
    }

}

let networkRetryPredicate: RetryPredicate = { error in
    if let err = error as? NetworkingError, let response = err.httpResponse {
        let code = response.statusCode
        if code >= 400 && code < 600 {
            return false
        }
    }

    return true
}

// Use this struct to pass the response and data along with 
// the error as alamofire does not do this automatically
public struct NetworkingError: Error {
    let httpResponse: HTTPURLResponse?
    let networkData: Data?
    let baseError: Error
}

来自服务器的响应可以是

代码语言:javascript
运行
AI代码解释
复制
{
  "status" : "error",
  "message" : " INSUFFICIENT_FUNDS"
}

代码语言:javascript
运行
AI代码解释
复制
{
  "status" : "success",
  "data" : " gghfgdgchf"
}

我的响应是这样处理的

代码语言:javascript
运行
AI代码解释
复制
class MaxResponse<T: NSObject>: MaxResponseBase, EVGenericsKVC {
    var data: T?

    public func setGenericValue(_ value: AnyObject!, forUndefinedKey key: String) {
        switch key {
        case "data":
            data = value as? T
        default:
            print("---> setGenericValue '\(value)' forUndefinedKey '\(key)' should be handled.")
        }
    }

    public func getGenericType() -> NSObject {
        return T()
    }
}

错误是

代码语言:javascript
运行
AI代码解释
复制
return ApiClient.session.rx.request(urlRequest: MaxApiRouter.topupWall(userId: getUser()!.id!, data: body))
            .convert(to: MaxResponse<Wall>.self)
EN

回答 1

Stack Overflow用户

发布于 2019-05-15 09:24:56

official Alamofire docs中提到了validate(),不带任何参数的

自动验证200..<300范围内的状态代码,以及响应的Content-Type标头是否与请求的Accept标头匹配。

因此,如果您没有包含Alamofire的validate(),那么您的意思是无论状态代码如何,如果请求确实通过了,您将认为它是成功的,这就是为什么它在失败块中没有显示任何内容的原因。

但是,如果您更喜欢使用它,是的,它会给您一个ResponseValidationFailureReason错误,但您仍然可以访问response.data。尝试打印它,您应该会看到来自服务器的预期错误响应:

代码语言:javascript
运行
AI代码解释
复制
if let responseData = response.data {
    print(String(data: responseData, encoding: .utf8))
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55865017

复制
相关文章
CORS跨域
当一个资源从与该资源本身所在的服务器不同的域或端口请求一个资源时,资源会发起一个跨域 HTTP 请求。
张炳
2019/08/02
2.1K0
CORS跨域
跨域 cors
特殊说明: 解决问题的光鲜,藏着磕Bug的痛苦。 万物皆入轮回,谁也躲不掉! 以上文章,均是我实际操作,写出来的笔记资料,不会出现全文盗用别人文章!烦请各位,请勿直接盗用!
收心
2022/01/19
6040
ajax cors跨域_jquery跨域
Jsonp 的实现原理就是:创建一个回调函数,然后在远程服务上调用这个函数并且将 JSON 数据形式作为参数传递,完成回调。
全栈程序员站长
2022/09/23
2.7K0
跨域,不止CORS
我们通常提到跨域问题的时候,相信大家首先会想到的是 CORS(跨源资源共享),其实 CORS 只是众多跨域访问场景中安全策略的一种,类似的策略还有:
ConardLi
2020/11/26
1.6K0
跨域和CORS
  同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。    
changxin7
2019/12/19
1.1K0
cors跨域探讨
前端跨域方案很多,jsonp、iframe等等,但是个人觉得,最正宗,最无损的跨域方式还是CORS。 CORS(Cross-origin resource sharing)是一个W3C标准,翻译过来是跨域资源共享。 它允许浏览器向跨域(协议、域名、端口任一不相同)服务器发送XMLHttpRequest请求。 目前支持所有现代浏览器(>IE10) 借阅了阮一峰大神的《跨域资源共享 CORS 详解》,结合自己的理解,说一说自己的CORS的领会。
用户1394570
2018/08/08
6430
CORS跨域漏洞的学习
最近斗哥在学习CORS的漏洞和相关的一些知识梳理,网站如果存在这个漏洞就会有用户敏感数据被窃取的风险。
漏斗社区
2018/12/29
4K0
Spring的跨域CORS实现
JSONP只支持GET请求,CORS支持所有类型的HTTP请求。JSONP的优势在于支持老式浏览器,以及可以向不支持CORS的网站请求数据。
十毛
2019/10/25
5220
跨域资源CORS简介
CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。
javascript.shop
2019/09/04
5030
Nginx 设置cors跨域
提示:有时候我们的后端是PHP文件,则需要把跨域的代码加 location ~ \.php(.*)$ 中。
ITer.996
2019/08/28
2.4K0
java配置跨域springboot配置Cors跨域
springboot配置Cors跨域、java最简单配置跨域解决方案 现在前后分离已经是很常见的一种开发方式了,所以难免会遇到跨域问题,之前用的比较多的是jsonp(本人表示没用过),之前我遇到这种问题一般都是用nginx做反向代理实现跨域请求。 不过springmvc4.2版本增加了对cors的支持,所以解决办法就更简单了,后端一个全局配置轻松解决跨域问题,比之前的都简单轻松。 cors协议不懂的可以百度哦,这里就不废话了。 由于现在大部分项目都是基于springboot做的,目前微服务的开发模式也很火,
码农笔录
2018/06/29
1.3K0
CORS 跨域与“钓鱼”
http://mpvideo.qpic.cn/0bf26qaaaaaareakmko7dnpfb5gdad2aaaaa.f10002.mp4?dis_k=b6c7c6e349458670c5b8e8f
老张的哲学
2022/04/11
2640
CORS解决跨域问题
浏览器中,网站A的网络请求访问网站A的资源(图片,HTTP请求)是很顺畅的,而想访问网站B的资源,就要面对跨域资源访问的问题了。面对跨域问题,有很多的解决方案,本文讨论使用 CORS 来解决的方案。
张云飞Vir
2020/03/27
2K0
(CORS) Nginx配置跨域
网站配置文件server 添加以下即可location / { add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache
用户9966982
2022/11/05
1.5K0
Flask配置Cors跨域
跨域是指:浏览器A从服务器B获取的静态资源,包括Html、Css、Js,然后在Js中通过Ajax访问C服务器的静态资源或请求。即:浏览器A从B服务器拿的资源,资源中想访问服务器C的资源。
用户1558882
2019/03/04
3.8K0
Flask配置Cors跨域
跨域问题及CORS解决跨域问题方法
跨域不一定会有跨域问题。因为跨域问题是浏览器对于ajax请求的一种安全限制:一个页面发起的ajax请求,只能是于当前页同域名的路径,这能有效的阻止跨站攻击。
Java架构师必看
2021/03/22
12.9K0
跨域共享CORS详解及Gin配置跨域
跨域简介 当两个域具有相同的协议(如http), 相同的端口(如80),相同的host,那么我们就可以认为它们是相同的域(协议,域名,端口都必须相同)。 跨域就指着协议,域名,端口不一致,出于安全考虑,跨域的资源之间是无法交互的(例如一般情况跨域的JavaScript无法交互,当然有很多解决跨域的方案) 解决跨域几种方案 /* CORS 普通跨域请求:只服务端设置Access-Control-Allow-Origin即可, 前端无须设置,若要带cookie请求:前后端都需要设置。
iginkgo18
2020/12/01
1.8K0
nginx跨域访问配置_cors跨域访问不了
跨域概念 简单来说:两个url只要协议、域名、端口有任何一个不同,都被当作是不同的域,相互访问就会有跨域问题。
全栈程序员站长
2022/11/15
4.6K0
nginx跨域访问配置_cors跨域访问不了
跨域资源共享(CORS)
简单先了解一下CORS,方便我们后续去挖一些CORS的漏洞,最近CORS也是比较火的!
黑伞安全
2019/10/16
3.6K0
AJAX 原理与 CORS 跨域
https://segmentfault.com/a/1190000011549088
Bug开发工程师
2018/09/21
1.4K0
AJAX 原理与 CORS 跨域

相似问题

闪亮,无法选择所选数据集的变量

119

跨数据集使用变量

11

声明变量集=选择

11

使用typedcolumn选择Spark数据集

23

基于变量的数据集的选择与聚焦

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文