NodeKit icon indicating copy to clipboard operation
NodeKit copied to clipboard

Не подставляются кастомные хедеры в multipart-запросы

Open chausovSurfStudio opened this issue 4 years ago • 0 comments

Лейбл не ставлю, решите сами, ошибка это или же мы что не так поняли. Но

  • использовали NodeKit на проекте, где в том числе были multiPart-запросы (загрузка фото)
  • объявили свой DefaultChain
    • final class DefaultChain<T: UrlRouteProvider>: UrlChainsBuilder<T>
  • у него переопределили
    • override func requestBuildingChain() -> Node<Json, Json>
  • в нём мы подставляли новые узлы, которые инжектят в запросы кастомные хедеры (к примеру), в том числе и критически важный хедер, содержащий userId

Проблема:

  • когда посылали multipart-запросы - хедеров ожидаемых не было

На что стоит обратить внимание:

На что обратили внимание. Файл UrlChainsBuilder.swift, там есть метод

open func build<I, O>() -> Node<I, O> where O: DTODecodable, O.DTO.Raw == Json, I: DTOEncodable, I.DTO.Raw == MultipartModel<[String : Data]> {

        let reponseProcessor = self.serviceChain.urlResponseProcessingLayerChain()

        let requestSenderNode = RequestSenderNode(rawResponseProcessor: reponseProcessor)

        let creator = MultipartRequestCreatorNode(next: requestSenderNode, session: session)

        let transformator = MultipartUrlRequestTrasformatorNode(next: creator, method: self.method)

        let queryInjector = URLQueryInjectorNode(next: transformator, config: self.urlQueryConfig)

        let router = self.requestRouterNode(next: queryInjector)
        let connector = MetadataConnectorNode(next: router, metadata: self.metadata)

        let rawEncoder = DTOMapperNode<I.DTO,O.DTO>(next: connector)
        let dtoEncoder = ModelInputNode<I, O>(next: rawEncoder)

        let indicator = LoadIndicatableNode(next: dtoEncoder)
        let configNode = ChainConfiguratorNode(next: indicator)

        return LoggerNode(next: configNode, filters: self.logFilter)
    }

то есть формирование цепочки идет в обход переопределяемого нами метода requestBuildingChain(), в отличие от, например

/// Создает обычную цепочку, только в качестве входных и вызодных данных имеет `Void`
    open func build() -> Node<Void, Void> {
        let input = self.requestBuildingChain()
        let indicator = LoadIndicatableNode(next: input)
        let configNode = ChainConfiguratorNode(next: indicator)
        let voidOutput = VoidIONode(next: configNode)
        return LoggerNode(next: voidOutput, filters: self.logFilter)
    }

В общем, есть ли проблема, можно ли ее поправить, или же это все решалось по-другому и проблем нет?)

chausovSurfStudio avatar Feb 12 '21 18:02 chausovSurfStudio