工作笔记--对接三方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 ...
随机推荐
- Spring Boot:快速入门教程
什么是Spring Boot? Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人 ...
- Electron构建一个文件浏览器应用(一)
在window.mac.linux系统中,他们都有一个共同之处就是以文件夹的形式来组织文件的.并且都有各自的组织方式,以及都有如何查询和显示哪些文件给用户的方法.那么从现在开始我们来学习下如何使用El ...
- OpenStack 通过某类可用域查找相应虚拟机使用的flavor模板
nova availability-zone-list:列出集群的所有可用域 截取部分结果: 通过可用域上的宿主机找相应的虚拟机 查看命令 通过 nova list --all-tenant --h ...
- HBase 学习之路(四)—— HBase集群环境配置
一.集群规划 这里搭建一个3节点的HBase集群,其中三台主机上均为Regin Server.同时为了保证高可用,除了在hadoop001上部署主Master服务外,还在hadoop002上部署备用的 ...
- MySQL优化(一)
MySQL数据库优化一之引索详解 对于网站优化最注重的就是数据库的优化,而在数据库优化中首先考虑到的应该是数据库索引是否建立于是否建立的正确. 1.对于刚刚接触数据库的程序员,对于引索不是很理解.下面 ...
- Centos7.3搭建DNS服务器--BIND
1.系统环境说明 [root@dns-server etc]# cat /etc/redhat-release CentOS Linux release (Core) 防火墙和Selinux关闭 [r ...
- 6.秋招复习简单整理之请你谈谈JDBC的反射,以及它的作用?
通过反射com.mysql.jdbc.Driver类,实例化该类时会调用该类的静态代码块,该代码块会去java的DriverManager类中注册自己,DriverManager管理所有已注册的驱动类 ...
- 【POJ - 2718】Smallest Difference(搜索 )
-->Smallest Difference 直接写中文了 Descriptions: 给定若干位十进制数,你可以通过选择一个非空子集并以某种顺序构建一个数.剩余元素可以用相同规则构建第二个数. ...
- Java底层技术系列文章-hashcode深入理解
带着问题去理解: 1. Object类HashCode方法是如何实现的,和String类有什么区别? 2.HashCode和Equals之间的关系? 一.hashCode作用 hashCode方法返回 ...
- Bzoj: 2073 [POI2004]PRZ 题解
2073: [POI2004]PRZ Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 401 Solved: 296[Submit][Status][D ...