Java实现Http/Https请求的方式

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

        工作中发现很多服务都是通过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

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页