工作笔记--对接三方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 ...
随机推荐
- selenium2 python 自动化测试实战
自动化测试,一个现在被炒的火热的词:各大公司都在嚷嚷着要上自动化测试的项目,都在招聘各种自动化测试人员…非常荣幸的受作者邀请来帮忙写这个序,诚惶诚恐,何德何能?不记得何时开始认识的作者了.当初只是作为 ...
- 第三章: Expressions and Flow Control
第三章: Expressions and Flow Control一:局部变量和实例变量定义变量是指设定变量的数据类型和变量的名字,Java语言要求变量遵循先定义,再初始化,然后使用的规则.作用域:指 ...
- 为什么string是引用类型 值还不可以修改
C#把数据类型分为值类型和引用类型.值类型操作简单,引用类型更省空间. C#一共有15个预定义类型,其中13个值类型(8个整型.2个浮点类型.decimal.bool.char),2个引用类型(str ...
- Python将pyc转为py
安装pip install uncompyle2, 使用uncompyle2 xxx.pyc > xxx.py
- GBDT--原来是这么回事(附代码)
1. 解释一下GBDT算法的过程 GBDT(Gradient Boosting Decision Tree),全名叫梯度提升决策树,使用的是Boosting的思想. 1.1 Boosting思想 Bo ...
- POJ 3318:Matrix Multiplication(随机算法)
http://poj.org/problem?id=3318 题意:问A和B两个矩阵相乘能否等于C. 思路:题目明确说出(n^3)的算法不能过,但是通过各种常数优化还是能过的. 这里的随机算法指的是随 ...
- Oracle数据库---触发器
SQL> --当我们对empnew执行删除操作之后,它就会出现一个提示信息,提示:这是删除操作!SQL> CREATE TRIGGER first_trigger 2 AFTER DELE ...
- Oracle数据库---PLSQL
SET SERVEROUTPUT ONBEGIN --打印输出 DBMS_OUTPUT.PUT_LINE('hello everyone!');END; DECLARE v_name VARCHAR2 ...
- mysql 免安装版本 与问题记录
将文件解压到D盘, 创建 my.ini 配置文件, ------------------复制进去--------------------- [client] port=3306 default-cha ...
- 分享几个能用的editplus注册码/2018年序列号
注册名:host1991 序列号:14F50-CD5C8-E13DA-51100-BAFE6 注册名:360xw 注册码:93A52-85B80-A3308-BF130-40412 ...