自己动手写一个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一般都会分开发送,从而导致多了一次。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容