使用Alamofire首次请求下载图片仅返回部分数据,二次请求正常是什么原因?
问题原因及修复方案
核心问题:请求编码配置错误
你当前封装的requestWithData方法对所有请求默认使用JSONEncoding.default编码,而你下载图片用的是GET请求,按照HTTP规范,GET请求的参数需要通过URL编码传递,使用JSON编码会导致请求头Content-Type被错误设置为application/json。
大部分图片服务端识别到不匹配的请求类型时,会提前截断响应内容、或者返回错误的短内容,这就是你首次请求只能拿到少量数据的原因;第二次请求时本地HTTP缓存命中,直接返回了完整的缓存数据,所以表现正常。
修复步骤
- 动态适配请求编码
修改requestWithData方法中AF.request的encoding参数,根据请求方法自动切换编码类型:
AF.request( url, method: method, parameters: parameters, // 新增动态编码逻辑:GET用URL编码,其他请求用JSON编码 encoding: method == .get ? URLEncoding.default : JSONEncoding.default, headers: headers, interceptor: interceptor ?? self )
- 可选优化:增加响应有效性校验
你可以在下载逻辑中增加响应头校验,判断返回数据的长度是否和Content-Length一致、以及Content-Type是否为图片类型,避免把错误响应当成图片数据处理:
.responseData(completionHandler: { (response) in switch response.result { case .success(let value): // 校验数据完整性 if let expectedLength = response.response?.expectedContentLength, value.count < expectedLength { // 数据不完整,返回自定义错误即可 promise(.failure(/* 自定义数据不完整错误 */)) return } promise(.success(value)) case .failure(let error): promise(.failure(self.createError(response: response.response, error: error, data: response.data))) } })
内容的提问来源于stack exchange,提问作者Peter Hlavatík
相关产品推荐
相关产品推荐

