暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

iOS请求访问文件网关服务图片接口异常问题的解决

搬运工来架构 2021-07-16
1923












1

问题背景

文件网关服务提供访问图片的接口,Android和浏览器访问正常,然而就唯独iOS这边死活访问失败,失败信息如下:


Error Domain=NSURLErrorDomain Code=-999 "已取消" UserInfo={NSErrorFailingURLStringKey=https://service.xxx/link/1202010141537537440000, NSErrorFailingURLKey=https://service.xxx/file-gateway/link/1202010141537537440000, _NSURLErrorRelatedURLSessionTaskErrorKey=( "LocalDataTask <59E2FB02-C920-4BD5-8F61-7B2150D154ED>.<1>" ), _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <59E2FB02-C920-4BD5-8F61-7B2150D154ED>.<1>, NSLocalizedDescription=已取消}



2

定位解决


1)从上面的信息,大概只能看到请求被取消,但是到底是什么原因还是不能确定。

在网上找了大量信息,有的说域名证书问题(运维排除),有的说iOS端处理的问题(iOS排除),等等始终找不到对应我们的问题并能解决。


2)接着以为是iOS对http响应头信息比较严格,跟正常访问图片的地址进行对比,尝试加了响应头字段信息比如:Last-Modified等始终还是一样的问题,没能解决(之前增加之后iOS同事说没问题了,但是现在却不行了??疑惑。)。


3)这个时候就想从http请求入手,跟进下网络请求的具体操作。就让iOS开发同事能不能在客户端那边做debug,或者将请求信息,比如请求头,响应头信息打印出来提供给我这边看下是哪里的问题?


下面是iOS同事提供的请求头信息:

异常请求响应头:


正常请求响应头

显然,我们从异常请求的状态码是406,即为“Not Acceptable”,也就是请求信息不被接受/允许。


接下来就让iOS同事把请求头信息提供下,如下:

于是将其Accept值放到本地postman进行重现,可以重现那么就可以自行在本地环境进行找原因。

可以发现,iOS是要求接受的类型是image/webp和image/*,所以相对就比较严谨,我发现为什么我们浏览器都能正常返回和响应,原因是:

前面的image/X都没有匹配到我们实际的图片资源image/png,所以最终就走了默认*/*,基本上就能正常通过。

回复公众号【资料】获得干货资料集锦:技术ppt、IT大会资料、架构、分布式资料等。


4)接着查看文件网关提供的接口源码

发现Controller上面被@Produces注解, 并且使用MediaType.APPLICATION_JSON,即application/json。所以基本上就知道异常问题的罪魁祸首了吧。


5)解决

去掉Controller上面的@Produces注解,或者在具体的方法上增加注解@Produces("image/*")。




3

总结


1)确定http接口请求接受的类型,即请求头Accept,不能盲目的设置。


2)controller上面尽量少使用@Produces,这种全局配置会将提供的具体接口都统一为一样,而是在具体接口上增加@Produces区分。


3)出现网络请求问题,可以先尝试打印请求头和响应头、响应体信息,看下是否有具体的异常,也不要停留在使用一些依赖组件抛出的问题,比如此次的iOS “code=-999 已取消”(明显,这种异常信息可能没什么用!),最后也许可能需要用到抓包技术来获取具体的报文信息等。

2020记

推荐好文
1、互联网Code Review最佳实践分享
2、dubbo面试题!会这些,说明你看懂了dubbo源码
3、Kafka面试题!掌握它才说明你真正懂Kafka
4、
Netty 5.0为啥被舍弃?原因竟然是...
5、
中台之上——业务架构系列【汇总】
6、必备瑞士军刀IDEA插件,你使用了哪些
7、线上热更新代码只需3步 Arthas实战
8、Eureka源码剖析之七:架构&面试题【总结】
9、互联网工程师应该用这种姿势打印日志

文章转载自搬运工来架构,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论