自己动手写一个HTTP请求

比如这样一个调用方法:


Image 17.png

将调用方式集成到一个getJsonString的方法里面,参数包含httpServerURL,isPost和paramMap,其中paramMap包含了公参和私参

Image 19.png

Image 20.png

这个里面有一个核心方法:getHttpURLConnection(),用这个方法得到urlConnection,然后读取结果
getHttpURLConnection()是这样写的:


Image 21.png

Image 23.png

Image 24.png

Image 25.png

解释一下这个方法:

  • Content-type:
    1.application/json;charset=UTF-8: 需要把paramMap转换成Jackson2Util.toJson(paramMap);
    2.其他:变成URLEncoder(entry.getKey(),"UTF-8")=URLEncoder(entry.getValue(),"UTF-8")的形式
    3.x-www-form-urlencoded:当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2…),然后把这个字串append到url后面,用?分割,加载这个新的url。
    4.multipart/form-data:当action为post时候,浏览器把form数据封装到http body中,然后发送到server。 如果没有type=file的控件,用默认的application/x-www-form-urlencoded就可以了。 但是如果有type=file的话,就要用到multipart/form-data了。浏览器会把整个表单以控件为单位分割,并为每个部分加上Content-Disposition(form-data或者file),Content-Type(默认为text/plain),name(控件name)等信息,并加上分割符(boundary)。
    (可参见https://blog.csdn.net/qq_28702545/article/details/51719199)
  • 如果是get请求,直接把paramString粘贴到链接后边,得到paramString的方法大致如下:
    Image 26.png

    1.ConnectTimeout , java 是这样解释的。 意思是用来建立连接的时间。如果到了指定的时间,还没建立连接,则报异常。
    2.ReadTimeout , java 是这样解释的。 意思是已经建立连接,并开始读取服务端资源。如果到了指定的时间,没有可能的数据被客户端读取,则报异常。
    经典异常如下:
    java.net.SocketTimeoutException: connect timed out
    java.net.SocketTimeoutException: connect timed out
    (可参见https://www.cnblogs.com/panxuejun/p/7753806.html)
  • setdooutput(true); setdoinput(true);
    首先,简单一句话:get请求的话默认就行了,post请求需要setDoOutput(true),这个默认是false的。
    为什么呢?对于我们这个链接来说,output是对服务器输出,input是服务器对我们输入,对于get请求,参数直接放在链接后边,因此output设置为false,对于post请求,是要传输很多数据的,因此要设置为true;
    又因为总是使用conn.getInputStream()获取服务端的响应,因此默认值是true,接收服务器对我们的输入。
    (可参见https://blog.csdn.net/u010665691/article/details/45558119)
  • setUseCaches(false):默认不使用缓存,这个估计是在浏览器或者是httpURLConnection中使用的
  • Content-Type:根据下载什么样的类型文件设定什么格式,具体格式参考如下:
    http://tool.oschina.net/commons/
  • Accept和Content-Type的区别
    简单的说:Accept:text/xml; Content-Type:text/html
    即代表客户端希望接受的数据类型是xml格式,本次客户端请求发送的数据的数据格式是html。
  • setRequestMethod("POST"):请求方法,如果是post方法,用urlConnection得到outputStream得到输出流,把参数(用utf-8编码)写到输入流里面去。)

相当于在url.openConnection()的时候就建立连接,一直保持到服务器自己的规定时间或者浏览器给服务器发送keepalive/ist的时候该状态才会断掉

至于为什么tcp会三次握手,四次握手断开,可以参考:https://blog.csdn.net/qzcsu/article/details/72861891,讲的真的是非常好。

这里稍微总结下

  • 为什么第三次握手:如果客户端发了第一次请求后,这个请求在网络节点里传输的比较慢或者发生了未知错误,客户端认为自己发的请求没发出去,就会再一次发送请求,如果第一次请求已经发给了服务器,那么建立两次连接就会发生不必要的错误和资源浪费,所以相当于用第三次握手确认连接的建立。
  • 为什么第四次握手 :为什么建立连接是三次握手,关闭连接确是四次挥手呢?

建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。
而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。

你可能感兴趣的:(自己动手写一个HTTP请求)