当前位置: 首页 > 知识库问答 >
问题:

如何在一个处理程序中处理所有类型请求的响应,同时也用Alamofire和Moya唯一地处理每个请求

厍和颂
2023-03-14

在我的应用程序中,我使用Moya和Alamofire(还有Moya/rxswift和Moya-ObjectMapper)库来处理所有的网络请求和响应。

null

例如,对于任何请求,我可以得到响应“无效版本”,我希望避免签入每个响应,如果这个错误到达。

有没有用 处理这个用例的优雅方法?

共有2个答案

扈阳辉
2023-03-14

我建议使用泛型参数化方法。

class DefaultNetworkPerformer {
    private var provider: RxMoyaProvider<GitHubApi> = RxMoyaProvider<GitHubApi>()


    func performRequest<T:Mappable>(_ request: GitHubApi) -> Observable<T> {
        return provider.request(request).mapObject(T.self)
    }
}

将处理来自您Moya 的所有请求。在我的例子中,它是 。此实现的示例用法如下:

var networkPerformer = DefaultNetworkPerformer()
let observable: Observable<User> = networkPerformer.performRequest(GitHubApi.user(username: "testUser"))

在这里,您可以“告知”网络执行者,该响应将包含 对象。

observable.subscribe {
    event in
    switch event {
    case .next(let user):
        //if mapping will succeed here you'll get an Mapped Object. In my case it was User that conforms to Mappable protocol
        break
    case .error(let error):
        //here you'll get MoyaError if something went wrong
        break
    case .completed:
        break
    }
}
汤修贤
2023-03-14

显然这很简单,你只需要创建你自己的插件。并将其添加到您的提供程序实例中(您可以在init函数中添加它)

例如:

struct NetworkErrorsPlugin: PluginType {

    /// Called immediately before a request is sent over the network (or stubbed).
    func willSendRequest(request: RequestType, target: TargetType) { }

    /// Called after a response has been received, but before the MoyaProvider has invoked its completion handler.
    func didReceiveResponse(result: Result<Moya.Response, Moya.Error>, target: TargetType) {

        let responseJSON: AnyObject
        if let response = result.value {
            do {
                responseJSON = try response.mapJSON()
                if let response = Mapper<GeneralServerResponse>().map(responseJSON) {
                    switch response.status {
                    case .Failure(let cause):
                        if cause == "Not valid Version" {
                            print("Version Error")
                        }
                    default:
                        break
                    }
                }
            } catch {
                print("Falure to prase json response")
            }
        } else {
            print("Network Error = \(result.error)")
        }
    }
}
 类似资料:
  • 基于名字的虚拟主机 Nginx首先选定由哪一个虚拟主机来处理请求。让我们从一个简单的配置(其中全部3个虚拟主机都在端口*:80上监听)开始: server { listen 80; server_name example.org www.example.org; ... } server { listen 80; server_nam

  • 本文向大家介绍Spring MVC 处理一个请求的流程,包括了Spring MVC 处理一个请求的流程的使用技巧和注意事项,需要的朋友参考一下 一个请求从客户端发出到达服务器,然后被处理的整个过程其实是非常复杂的。本博客主要介绍请求到达服务器被核心组件DispatcherServlet处理的整理流程(不包括Filter的处理流程)。 1. 处理流程分析 Servlet处理一个请求时会调用servi

  • 我一直试图向facebook发送HTTP POST请求,但没有成功。我从服务器收到以下响应: HTTP/1.1 400不良请求内容-类型:text/html;charset=utf-8日期:2016年12月10日星期六21:28:17 GMT连接:关闭内容-长度:2959 Facebook |错误 抱歉,出了点问题,我们正在修理,会尽快修好的 我的密码 我做错了什么?

  • 我想让一个Servlet首先处理对JSP页面的所有请求。Servlet将用于根据所请求的JSP设置服务器端变量。 例如,我想要实现的是给出URL:example.com/index.JSP,Servlet首先通过解析出请求的JSP(index.JSP)来处理请求,设置特定于请求的index.JSP的变量(使用),然后分派到实际的index.JSP(例如/web-inf/index.JSP)。然后,

  • 我有一个用C#编写的grpc服务,它有2个调用,如Start和Stop。当客户端调用Start(这个调用需要很多时间),然后Stop服务器同步处理请求,而grpc启动了4个线程。 您能帮我了解它是否按设计运行,或者我错过了任何其他设置吗?

  • 问题内容: 我的Flask应用程序必须进行大量计算才能获取特定页面。在Flask执行该功能时,其他用户无法访问该网站,因为Flask忙于进行大量计算。 有什么方法可以使我的Flask应用程序接受来自多个用户的请求? 问题答案: 是的,将应用程序部署在其他WSGI服务器上,请参阅Flask部署选项文档。 Flask随附的服务器组件实际上仅用于开发应用程序时;即使可以将其配置为处理并发请求(从Flas