工作笔记--对接三方Http接口遇到的问题
在使用 HttpClient 4.4 调用第三方 http api 时遇到了很多问题,还好最后都解决了,记录一下遇到的问题及解决办法,希望对同样有此问题的你有所帮助。
环境说明
首先说明一点是,对方的测试环境是在公共的网络环境下部署的,即是对外开放的,需用外网访问,不支持内网,只支持走专线(目前不考虑这个方式,因为铺设专线耗时还耗经费)。
所以在调试接口的时候就直接在个人笔记本上使用 POSTMAN 这样的接口调试工具进行调试。
在微信群里和第三方联调,对方告诉我们需要调用哪几支接口,然后我们就按照接口文档去调试了。
调试的过程中发现了很多的问题。例如,对方并没有口头或文档说明需要传APPID、APPKEY和一些其他参数,这些参数是放在Head头部的,三方没有提前告诉我们需要这些参数,我们在联调时发现接口报异常【APPID 不能为空】,然后就把这个问题发到群里,半天才回复,而且是他们内部互相踢皮球,搞了半天才确定谁去解决。
不就是在系统里创建一个appid和密钥嘛,结果第二天下午才给搞好。这效率真是没法说,而且我觉得既然跟我们合作(我们是强势方),你就把需要的东西都准备好了,有啥问题积极回答、解决,这样效率也高。
这个问题解决了,需要调的接口通过 POSTMAN 很快就都调试了一遍,没啥大问题都正常通过联调,接下来就是通过代码调用了,还有处理一些细节的东西。
解决文件上传发送multipart/form-data请求
由于对方测试环境是部署在外网,我们公司的开发环境是在公司的内网,而且必须在公司的内网里开发(不然连不上数据库项目启动不了),这个问题是没办法解决的,所以就干脆先在自己的笔记本电脑上把代码写完,再传到公司开发机上。
刚开始打算使用 Java 自带的 java.net.HttpURLConnection 那一套方式,但是调第二个接口时发现需要上传文件,content-type需要为 multipart/form-data。
如果还继续使用 java.net 包下的那一套就会非常麻烦,因为上传文件和普通参数不一样,需要有分割符来分割文件以及普通参数,因为服务端需要知道文件从哪开始到哪结束。
这些工作需要客户端程序来处理,如果还继续用java.net包下的类,将会使此工作开发起来很麻烦,所以最后选择使用 HttpClient 工具包来处理这个问题。
HttpClient 是 Apache 软件基金会下的开源项目,是目前较流行和好用的 http 网络请求工具包,遵循Java面向对象编程的原则。。。关于 HttpClient 就不多说了,想了解的自行百度下。
HttpClient封装了发送 multipart/form-data 类型的请求的实现细节,具体使用方法见这篇文章。
在 HttpClient 的帮助下,基本代码已经写完且相关接口都已经通过代码的方式调通了。
解决代理及 400 Bad request
于是便把代码上传至公司的开发机,准备完善一些细节处理。
等这些工作都做完时,委托同事开通的代理服务器到第三方IP的网络策略也都已经搞完(开发机、测试环境都是内网环境,不能直连互联网,故需通过代理服务器来访问目标地址,到时候线上也一样。我们的开发机访问不了代理服务器,所以只能在测试环境测)。
把代码提交后部署到测试环境后,我已经迫不及待的想要测试一下了。这是第一次测试这个功能,我记得是失败了,报错,400 Bad request。这是什么问题?参看这篇,但是网上说的最多的两种情况,都和我的不符,所以在这篇文章也找到了解决办法。
因为我测试环境走的代理,在自己笔记本联调时是互联网直连的,所以没有此问题。通过查看代码,我发现我设置代理的时候用的默认的 HTTP 协议,而我要访问的目标地址是 HTTPS 的,所以我怀疑是这的问题。于是我就把目标地址改为HTTP 方法请求(对方也支持HTTP),果然好了。但这样又引发了其他问题,且看下面。
解决 502 Bad Getway
接下来的很多次,再去测试的时候,发现很多时候都是报超时,Read timeout, 因为我设置的等待响应的时间是10秒。我把这个设置去掉之后,大概等30秒,返回的错误是 502 Bad Getway
502 Bad Gateway是指错误网关,无效网关;在互联网中表示一种网络错误。表现在WEB浏览器中给出的页面反馈。含义:这通常并不意味着上游服务器已关闭(无响应网关/代理) ,而是上游服务器和网关/代理使用不一致的协议交换数据。鉴于互联网协议是相当清楚的,它往往意味着一个或两个机器已不正确或不完全编程。
这是什么错?无从下手啊。
想着是不是还是协议不一致导致的?于是我又把协议这方面的 http 对 https ,这样互相排列组合的改了几次还是不行。
然后我就在网上搜这个问题咋解决,无意中在一个国外的网站行看到有人问这个问题咋解决
其中一个回复说【您可能正在使用代理来获取ssl内容,但您的代理设置是错误的。您应该考虑使用http作为代理方案,然后使用https作为实际内容的方案。这解决了我的问题】
说的好准,确实使用了代理。
解决证书问题-javax.net.ssl.SSLException:Unrecognized SSL message,plaintext connection?
于是把代理又改成 HTTP 的,然后又抛异常:jvax.net.ssl.SSLException:Unrecognized SSL message,plaintext connection?
查了一下意思是说,无法识别 SSL 信息,明文连接?原来是证书方面的问题,要加一下代码,使其信任所有证书,具体怎么加看这篇。
然后按这篇文章加了信任所有证书就好了。
总结
之前对 Http 接口不是太了解,基本上没怎么用过,通过这次认识到了自己在这方面的知识很欠缺,要好好补一补了。
工作笔记--对接三方Http接口遇到的问题的更多相关文章
- 用vetr.x写一个HTTP接口适配器, 对接各种形式接口
用vetr.x写一个HTTP接口适配器, 对接各种形式接口 项目地址:https://github.com/hjx601496320/transmit 业务说明 在日常开发工作中,我们经常会遇到要和各 ...
- 《工作笔记:移动web页面前端开发总结》
工作笔记:移动web页面前端开发总结 移动web在当今的发展速度是一日千里,作为移动领域的门外汉,在这段时间的接触后,发现前端开发这一块做一个小小的总结. 1.四大浏览器内核 1.Trident (I ...
- 关于调用三方平台接口与推送接口的总结<二>(2020.7.27)
前言:本篇博客是接着上篇总结写的,想了解怎么对接第三方平台接口的同学可以看我上一篇博客,地址是 https://www.cnblogs.com/alanturingson/p/13377500.ht ...
- 对接第三方支付接口-获取http中的返回参数
这几天对接第三方支付接口,在回调通知里获取返回参数,有一家返回的json格式,请求参数可以从标准输入流中获取. //1.解析参数 , 读取请求内容 BufferedReader br; String ...
- 2016年第2周读书笔记与工作笔记 scrollIntoView()与datalist元素
这一周主要是看了html5网页开发实例与javascript 高级程序设计,供以后翻阅查找. html5网页开发实例第1章与第二章的2.1部分: 第1章内容: html5在w3c的发展史. 浏览器的 ...
- 【转】android camera(二):摄像头工作原理、s5PV310 摄像头接口(CAMIF)
关键词:android camera CMM 模组 camera参数 CAMIF平台信息:内核:linux系统:android 平台:S5PV310(samsung exynos 4210) 作者 ...
- javascript - 工作笔记 (事件四)
在javascript - 工作笔记 (事件绑定二)篇中,我将事件的方法做了简单的包装, JavaScript Code 12345 yx.bind(item, "click&quo ...
- 工作笔记3.手把手教你搭建SSH(struts2+hibernate+spring)环境
上文中我们介绍<工作笔记2.软件开发经常使用工具> 从今天開始本文将教大家怎样进行开发?本文以搭建SSH(struts2+hibernate+spring)框架为例,共分为3步: 1)3个 ...
- Sencha Touch2 工作笔记
Sencha Touch2 工作笔记 Ext.dataview.List activate( this, newActiveItem, oldActiveItem, eOpts ) Fires whe ...
随机推荐
- 确认过眼神,看清HTTP协议
导读:什么是 HTTP?它有什么属性?我们常用的是什么呢?快来阅读本文,将会为你一一道来. 什么是 HTTP 协议? 在了解HTTP之前,我们需要了解什么是网络通信模型(也就是我们常说的 OSI 模型 ...
- idea提交代码到自己git账号的master branch
1.注册GitHub账号 2.创建本地密钥与远程仓库连接(使用idea的话,这第二步可能不是必须的,但是密钥我之前配置过.所以写下来) ①安装git 客户端sudo apt-get install g ...
- X-Admin&ABP框架开发-数据字典
在业务型的系统开发中,我们需要维护各种个样的类型,比如客户类型.客户行业.商品类型等等,这些类型往往信息量不多,并且相似度极高,如果采用一类型一表去设计,将会造成极大的工作量,通过将这部分类型的信息进 ...
- 数据库root密码删除
1 打开mysql.exe和mysqld.exe所在的文件夹,复制路径地址 2 打开cmd命令提示符,进入上一步mysql.exe所在的文件夹. 3 输入命令 mysqld --skip-g ...
- Java NIO学习系列三:Selector
前面的两篇文章中总结了Java NIO中的两大基础组件Buffer和Channel的相关知识点,在NIO中都是通过Channel和Buffer的协作来读写数据的,在这个基础上通过selector来协调 ...
- Codeforces Gym101257F:Islands II(求割点+思维)
http://codeforces.com/gym/101257/problem/F 题意:给出一个n*m的地图,上面相同数字的代表一个国家,问对于每个国家有多少个国家在它内部(即被包围).例如第一个 ...
- K2工作流引擎Demo
---恢复内容开始--- 以前的工作都是电商网站形式的,从未接触过工作流相关工作,新公司是传统制造业行业,我进的这个组又是做工作流这块相关工作的,所以避免不了和工作流打交道. 这边工作流主要用K2来做 ...
- cookie 和 session 设置
cookie: 保存在浏览器上的一组键值对, 是由服务器让浏览器进行设置的 下次浏览器访问的时候会携带cookie. request是客户端请求, response是服务端响应. 读取客户端的cook ...
- 西门子PLC中各个组织块OB作用(OB1、OB100……)
1.自由循环组织块OB1 S7 CPU启动完成后,操作系统循环执行OB1,OB1执行完成后,操作系统再次启动OB1.在OB1中可以调用FB.SFB.FC.SFC等用户程序使其循环执行.除OB90以外 ...
- 热度3年猛增20倍,Serverless&云开发的技术架构全解析
『 作为一个不断发展的新兴技术, Serverless 热度的制高点已然到来.』 或许,Google Trends 所显示的 3 年猛增 20 倍的" Serverless " 搜 ...