文件网关服务提供访问图片的接口,Android和浏览器访问正常,然而就唯独iOS这边死活访问失败,失败信息如下:
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,所以最终就走了默认*/*,基本上就能正常通过。
4)接着查看文件网关提供的接口源码
发现Controller上面被@Produces注解, 并且使用MediaType.APPLICATION_JSON,即application/json。所以基本上就知道异常问题的罪魁祸首了吧。
5)解决
去掉Controller上面的@Produces注解,或者在具体的方法上增加注解@Produces("image/*")。
1)确定http接口请求接受的类型,即请求头Accept,不能盲目的设置。
2)controller上面尽量少使用@Produces,这种全局配置会将提供的具体接口都统一为一样,而是在具体接口上增加@Produces区分。
3)出现网络请求问题,可以先尝试打印请求头和响应头、响应体信息,看下是否有具体的异常,也不要停留在使用一些依赖组件抛出的问题,比如此次的iOS “code=-999 已取消”(明显,这种异常信息可能没什么用!),最后也许可能需要用到抓包技术来获取具体的报文信息等。
2020记
4、Netty 5.0为啥被舍弃?原因竟然是...
5、中台之上——业务架构系列【汇总】
文章评论