比如这样一个调用方法:
Image 17.png
将调用方式集成到一个getJsonString的方法里面,参数包含httpServerURL,isPost和paramMap,其中paramMap包含了公参和私参
Image 19.pngImage 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一般都会分开发送,从而导致多了一次。
网友评论