Alamofire 上传功能打印 responseJSON

Posted

技术标签:

【中文标题】Alamofire 上传功能打印 responseJSON【英文标题】:Alamofire upload function print the responseJSON 【发布时间】:2021-04-15 22:43:51 【问题描述】:

这是我的 alamofire 函数...

        AF.upload(
            multipartFormData:  multipartFormData in
                multipartFormData.append(imageData, withName: "imagePath" , fileName: "profile-image.png", mimeType: "image/png")
                for (key, value) in params 
                    multipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key)
                    
                print(multipartFormData.contentLength)
        ,
            to: URLLink, method: .post, headers: headers)
            .downloadProgress  progress in
                print(progress)
            
        
            .response  response in
                print(response.result)
            
            .responseJSON(completionHandler: data in
                print(data)
            )

如何以 JSON 格式打印响应,以便根据提供的信息处理来自服务器的响应?

response.result 和 response.value 不像普通请求函数那样做。

.responseJSON() 不响应来自服务器的响应。打印出来的数据是:

failure(Alamofire.AFError.responseSerializationFailed(reason: Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(error: Error Domain=NSCocoaErrorDomain Code=3840 "Garbage at end." UserInfo=NSDebugDescription=Garbage at end.)))

但是,它成功了,图像和数据被发送到服务器/数据库。

【问题讨论】:

使用.responseJSON 试过了。生病把我的代码贴在@Dilan 上面 你需要弄清楚为什么它认为你的 JSON 最后有垃圾,你可能需要从中过滤掉一些东西。 响应 json 可能包含多个对象但未包含在数组中。请与您的后端开发人员联系并获取示例响应。 【参考方案1】:

选项 1

Alamofire 提供开箱即用的 JSON 序列化程序,即 responseJSON()

    /// Adds a handler to be called once the request has finished.
    ///
    /// - parameter options:           The JSON serialization reading options. Defaults to `.allowFragments`.
    /// - parameter completionHandler: A closure to be executed once the request has finished.
    ///
    /// - returns: The request.
    @discardableResult
    public func responseJSON(
        queue: DispatchQueue? = nil,
        options: JSONSerialization.ReadingOptions = .allowFragments,
        completionHandler: @escaping (DownloadResponse<Any>) -> Void)
        -> Self

选项 2

response() 是更通用的方法。您可以将响应序列化为您自己的输出类型(JSON、String 等...)。

这是response() 方法的函数头。你可以通过指定responseSerializer来指定你需要什么样的输出。

    /// Adds a handler to be called once the request has finished.
    ///
    /// - parameter queue:              The queue on which the completion handler is dispatched.
    /// - parameter responseSerializer: The response serializer responsible for serializing the request, response,
    ///                                 and data contained in the destination url.
    /// - parameter completionHandler:  The code to be executed once the request has finished.
    ///
    /// - returns: The request.
    @discardableResult
    public func response<T: DownloadResponseSerializerProtocol>(
        queue: DispatchQueue? = nil,
        responseSerializer: T,
        completionHandler: @escaping (DownloadResponse<T.SerializedObject>) -> Void)
        -> Self

您可以使用此静态方法DownloadRequest.jsonResponseSerializer() 来获取response() 方法中所需的JSON Serializer。

public static func jsonResponseSerializer(
        options: JSONSerialization.ReadingOptions = .allowFragments)
        -> DownloadResponseSerializer<Any>

【讨论】:

这些将如何使用?

以上是关于Alamofire 上传功能打印 responseJSON的主要内容,如果未能解决你的问题,请参考以下文章

记录alamofire上传图片请求和响应

无法使用 alamofire 4 上传带参数的图像?

ios、alamofire中的响应处理问题

Alamofire的get请求,post请求,以及上传字典

Swift - “Alamofire.upload” -> “AF.upload” 上传功能问题

如何在 Alamofire 4.0 中添加带有上传进度百分比的标签的进度条