Java实现Http/Https请求的方式

原创 2018年04月17日 16:57:14

        工作中发现很多服务都是通过Http来提供服务:各模块之间通过Http来请求数据、外部服务例如各种Api(微信公众号小程序接口等)。作为用Java为开发语言的后端开发,实现Http请求的方式有原始Socket、URLConnection、HttpURLConnection、第三方工具HttpClient等。网络上已经有很多前人做了归纳,这里做个笔记:

       1. java.net.Socket 是最原始的实现方式

        Socket可以建立两个终端之间的通信,将端口port设为80,即使实现了向服务器发送http请求。

       2. URLConnection

        抽象类 URLConnection 是所有类的超类,它代表应用程序和 URL 之间的通信链接。此类的实例可用于读取和写入此 URL 引用的资源。URLConnection 基于Http协议。通常,创建一个到 URL 的连接需要几个步骤: 通过在 URL 上调用 openConnection 方法创建连接对象——> 设置参数和一般请求属性 ——> 使用 connect 方法建立到连接对象的tcp连接 ——> 调用连接对象的getInputStream()方法发送http请求,并获取响应数据。

      注:

      (1)URLConnection的connect()函数,实际上只是建立了一个与服务器的tcp连接,并没有实际发送http请求。
无论是post还是get,http请求实际上直到HttpURLConnection的getInputStream()这个函数里面才正式发送出去。
       (2)在用POST方式发送URL请求时,URL请求参数的设定顺序是重中之重, 
对connection对象的处理设置参数和一般请求属性和写入提交数据都必须要在connect()函数执行之前完成。对outputStream的写提交数据操作,必须要在inputStream的读操作之前。这些顺序实际上是由http请求的格式决定的。
       (3)http请求实际上由两部分组成,一个是http头,所有关于此次http请求的配置都在http头里面定义,一个是正文content。connect()函数会根据HttpURLConnection对象的配置值生成http头部信息,因此在调用connect函数之前,就必须把所有的配置准备好。
      (4)在http头后面紧跟着的是http请求的正文,正文的内容是通过outputStream流写入的, 

实际上outputStream不是一个网络流,充其量是个字符串流,往里面写入的东西不会立即发送到网络,而是存在于内存缓冲区中,待outputStream流关闭时,根据输入的内容生成http正文。至此,http请求的东西已经全部准备就绪。在getInputStream()函数调用的时候,就会把准备好的http请求正式发送到服务器了,然后返回一个输入流,用于读取服务器对于此次http请求的返回信息。由于http请求在getInputStream的时候已经发送出去了(包括http头和正文),因此在getInputStream()函数之后对connection对象进行设置(对http头的信息进行修改)或者写入outputStream(对正文进行修改)都是没有意义的了,执行这些操作会导致异常的发生。

        3. HttpURLConnection

        支持 HTTP 特定功能的 URLConnection。每个 HttpURLConnection 实例都可用于生成单个请求,但是其他实例可以透明地共享连接到 HTTP 服务器的基础网络。请求后在 HttpURLConnection 的 InputStream 或 OutputStream 上调用 close() 方法可以释放与此实例关联的网络资源,但对共享的持久连接没有任何影响。如果在调用 disconnect() 时持久连接空闲,则可能关闭基础套接字。

       4. HttpClient

       HttpClient有两个版本  org.apache.commons.httpclient 这个包的版本为3.2 已经停止更新了,org.apache.http.client包下的版本为4.X。一般都用新版的了。

   

     具体的例子参考 https://blog.csdn.net/u010197591/article/details/51441399 点击打开链接

                              https://blog.csdn.net/laiyaxing/article/details/51585755 点击打开链接

.......后续再补充https请求的实现

      http传输的信息相当于在互联网中裸奔,于是前人在传输层(TCP/UDP)之上加了一个用于加解密所传输数据的协议层(TLS/SSL),这就是https了。

      TLS(Transport Layer Security,传输层安全协议)与SSL(Secure Socket Layer,安全套接字层)的区别我理解为就是两者所用的加解密算法不一样,协议的版本越高所用的加密算法越安全。例如  TLS1.2 > TLS1.1 > TLS1.0 

       TLS1.0是在SSL3.0的基础上开发的,两者差别极小,TLS1.0可以视为SSL3.1。

       至于java发送https请求和其他更多的细节参考一下文章:

       图解SSL/TLS协议    SSL与TLS的区别以及介绍   java中 SSL认证和keystore使用   

      使用HttpsURLConnection的3种方法小结   如何使用JAVA请求HTTPS

版权声明:欢迎转载 https://blog.csdn.net/liaoqianwen123/article/details/79976748

JAVA实现http/https的Post、Get、代理访问请求

前言平时测试的时候可能会遇到使用Java发送http或者https请求的需求.网上找了一圈暂时没有发现比较称心方便能够直接使用的代码.所以就借鉴别人的代码按自己需求改造了一下.主要实现http/htt...
  • M1mory
  • M1mory
  • 2017-08-08 22:13:24
  • 1039

如何在java中发起http和https请求

一般调用外部接口会需要用到http和https请求。 一.发起http请求 1.写http请求方法 //处理http请求 requestUrl为请求地址 requestMethod请求方式,值为"...
  • guozili1
  • guozili1
  • 2017-01-03 15:47:02
  • 24568

Java Socket 实现HTTP与HTTPS协议发送POST/GET请求

JAVA Socket 实现HTTP与HTTPS客户端发送POST与GET方式请求         哇,一看标题怎么这么长啊,其实意思很简单,哥讨厌用HTTP Client做POST与GET提交觉...
  • zmx729618
  • zmx729618
  • 2016-05-11 15:00:31
  • 7683

JAVA发送HTTP请求(https SSL)实现案例

可以用做http工具类,供大家参考,欢迎大家一起交流学习, 下面我直接贴代码,如下: import java.io.BufferedReader; import java.io.ByteArr...
  • zhoumengshun
  • zhoumengshun
  • 2018-01-18 19:42:00
  • 881

基于java 使用http-post方式请求https webservice接口

此文章记录使用httppost 方式请求https接口,安全证书默认全部接收。 此方法经测试为可行,希望可以帮到需要的朋友。 /** * 请求https的接口 *  * @param url 接口地址...
  • limengyan123
  • limengyan123
  • 2017-06-09 09:43:18
  • 3464

java发送http/https请求(get/post)代码

  • 2016年12月02日 15:19
  • 1.47MB
  • 下载

JAVA利用HttpClient进行POST和GET请求(HTTPS)

目前,要为另一个项目提供接口,接口是用HTTP URL实现的,最初的想法是另一个项目用JQuery post进行请求。 但是,很可能另一个项目是部署在别的机器上,那么就存在跨域问题,而JQuer...
  • zy_281870667
  • zy_281870667
  • 2016-03-16 17:21:24
  • 14422

java post方式传递数据的两种方式(http https)

采用哪种方式传递数据,主要取决于目标地址是否有ssl协议。即前缀是http还是https 1.http方式:字段解析: 1.url:表示要传递到的目标地址 String类型 2.b...
  • NepalTrip
  • NepalTrip
  • 2017-08-22 16:53:56
  • 974

java封装httpClient工具(支持http和https,包含get和post请求)

网上有关方法非常多,但相对较零散,有些只支持http或https中的一种,或者只有get或post中的一种。以下对httpclient工具做了比较全面的封装,支持http和https,包含get和po...
  • xinxiran
  • xinxiran
  • 2017-12-25 16:18:25
  • 685

HTTPS客户端java实现

https是http加入ssl安全协议后的数据传输协议,提供身份验证与加密通讯,默认端口为443,关于握手协议参考这里写链接内容SSL是在安全套接层、传输层保障数据安全性的协议,安全认证过程: 1)...
  • pacoolin
  • pacoolin
  • 2017-11-28 16:30:40
  • 411
收藏助手
不良信息举报
您举报文章:Java实现Http/Https请求的方式
举报原因:
原因补充:

(最多只允许输入30个字)