Java 进阶 & HttpClient 总结

采用Http连接池的方式,管理http的连接,这样可以减少每次请求创建、关闭连接的时间。
用httpclient工具包,可创建连接池,并对连接池中的http连接进行管理和设置。
1、设置http连接最大并发数
2、设置http连接最大连接时间
3、设置代理等
HTTP1.1规定Http请求的方式有 GET,POST,DELETE,PUT等方式,最高用的是GET,POST。
Get,向服务器获取数据。
Post,向服务器提交数据。
HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为三个部分:状态行、请求头、消息主体.

使用httpclient,发送各类http请求
1、发送get请求
get请求,参数都在url中,所以无需单独做处理。直接设置头部信息即可。
1)使用HttpGet类,setConfig(连接池相关设置),addHeader(HTTP.CONTENT_ENCODING, "UTF-8")增加头部信息的字符编码格式
如果,get请求需要传递头部信息,需要 使用setHeader(key,value)设置参数值
2)使用已建立起的http连接,执行get请求
3)执行请求后,http会返回响应结果,可以通过CloseableHttpResponse 对象获取请求的响应状态,响应内容等

2、发送post请求
Http协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定提交的数据的编码方式。所以发送的Post请求的消息主体格式可以自由决定,只要最终发送的post 请求提交的消息主体满足指定的格式即可。
服务器内置了自动解析常见数据格式的功能,所以在解析post请求提交的数据时, 通常是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。

Post提交数据方式,对应的常用content-type取值
1)application/x-www-form-urlencoded,浏览器的原生表单提交
首先,Content-Type 被指定为 application/x-www-form-urlencoded;
其次,提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码。仿form表单提交数据的方式完成请求的。

与get请求不同的是,这种post请求方式,需要利用UrlEncodedFormEntity对象传入List集合来加载body.List集合的类型是NameValuePair接口,NameValuePair的实现类BasicNameValuePair类似于Map,可直接以key-value的形式传参。
通过setEntity(UrlEncodedFormEntity的实例)设置请求主体。

2)application/json 服务端消息主体是 JSON 字符串
针对json字符串作为消息主体的处理,需要使用StringEntity对象
用加载过json的StringEntity实例对象设置json的编码格式setContentEncoding(编码格式),设置setContentType为application/json。
最后,将StringEntity实例对象设置到HttpPost请求中setEntity。
其他部分,如设置Header,执行post请求的发送,同get请求

3)multipart/form-data 表单上传文件
HttpCient4.3之后上传文件主要使用的类是位于org.apache.http.entity.mime下的MultipartEntityBuilder.上传文件需要将文件转化成字节。基本实现步骤如下:
a.设置上传的模式;
setMode(HttpMultipartMode mode),其中mode主要有BROWSER_COMPATIBLE,RFC6532,STRICT三种,默认值是STRICT。
b.利用MultipartEntityBuilder.create()来创建MultipartEntityBuilder对象;
c.添加需要上传的数据,使用addBinaryBody(以二进制的形式添加数据)
addBinaryBody(String name, File file, ContentType contentType, String filename)
addBinaryBody(String name, InputStream stream, ContentType contentType, String filename)
addBinaryBody(String name, byte[] b, ContentType contentType, String filename)
d.添加文本数据,使用addTextBody
addTextBody(String name, String text, ContentType contentType)
测试中选用了addBinaryBody。其中,第一个参数name的值,是服务器已经定义好的,服务器会根据这个字段来读取我们上传的文件流,不匹配则会报错。
e.将MultipartEntityBuilder对象的build结果设置到HttpPost请求中setEntity
其他部分,如设置Header,执行post请求的发送,同get请求

下载文件,只需要将post的响应结果,写入到指定文件中即可
可以使用FileUtils.copyToFile(response.getEntity().getContent(),descfile)方法

4)text/xml XML 作为编码方式
XML 有两种 MIME 媒体类型:text/xml 和 application/xml。
这两种类型主要是对头的处理不同,application/xml 会根据头编码,而text/xml 会忽略头,所以建议用前者。
即当要指定头部编码时使用application/xml<?xml version='1.0' encoding='GBK>。无需指定头部编码可以使用text/html,则数据传输默认使用us-ascii编码编码。

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong阅读 22,301评论 1 92
  • 正在日更文章时,老妈来了电话。 “喂,怎么了” “没事,就问下你月底回去了,你考试怎么办?” “考试时间是在中旬,...
    挠人小妖精阅读 413评论 1 1
  • 10年前,当我第一次确认自己穿越到了宋代时,我曾经有过一些不切实际的想法,这些想法包括但不限于:制造蒸馏酒,抄袭后...
    安迪斯晨风阅读 906评论 3 5
  • 「失恋这条路,再难你也要走完!」 文|二璐 排版|娄皓晨 图|网络 01 拉萨的阳光很好,桌子很想哭。 这是她...
    二璐阅读 162评论 1 2