Apache HttpComponents学习笔记(一):请求对象和响应对象


HttpClient接口是主要的入口:用户提供请求对象交给HttpClient执行,HttpClient负责把请求对象传递给服务器,然后返回响应对象,或者抛出异常。

    HTTP-message   = Request | Response     ; HTTP/1.1 messages
 
    generic-message = start-line
                    *(message-header CRLF)
                    CRLF
                    [ message-body ]

    start-line      = Request-Line | Status-Line
 
    Request       = Request-Line
                    *(( general-header
                    | request-header
                    | entity-header ) CRLF)
                    CRLF
                    [ message-body ]

    Response      = Status-Line
                    *(( general-header
                    | response-header
                    | entity-header ) CRLF)
                    CRLF
                    [ message-body ]

    message-header = field-name ":" [ field-value ]

    field-value  = [ element ] *( "," [ element ] )
    element = name [ "=" [ value ] ] *( ";" [ param ] )
    param   = name [ "=" [ value ] ]

请求对象的首行称为Request-Line,包含三部分信息:HTTP方法,请求URI和HTTP协议版本。
响应对象的首行称为Status-Line,包含三部分信息:HTTP协议版本,状态码和与状态相关的短语。
请求对象的URI:hc提供的URIBuilder工具类能简化URI的创建、修改和resolve。
请求对象和响应对象实现了HttpMessage接口里的各种获取、增加、删除和迭代headers的方法。


请求对象的HTTP方法:在hc里,每种HTTP方法都有对应的请求对象类型:HttpGet, HttpHead, HttpPost, HttpPut, HttpPatch, HttpDelete, HttpTrace, 和HttpOptions. 其中只有HttpPost, HttpPut, HttpPatch可以携带Entity。
响应对象都可以携带Entity,以下响应类型除外:对HEAD请求的响应,204 No Content响应,304 Not Modified响应,205 Reset Content响应。
Entity分为三种类型:streamed, self-contained和wrapping. streamed类型的Entity的内容是不能重复读取的,只能读取一次,isRepeatable()方法返回false。self-contained类型的Entity的内容可以重复读取,isRepeatable方法返回true. wrapping类型的Entity用于包装其他Entity.
hc提供的了EntityUtils工具类。


只有关闭streamed Entity的content stream或/和关闭响应对象,才能释放系统资源。区别在于,关闭content stream能保持底层连接的存活,而关闭响应对象会立即关闭并丢弃底层连接。EntityUtils.consume(HttpEntity)方法能用来保证streamed Entity能正常关闭content stream.
如果只关闭响应对象,不关闭streamed Entity的content stream, 也能正常释放系统资源,并且无法再从content stream中读取内容。这适用于只需要从content stream中读取部分内容就释放资源的场景。
EntityUtils的toByteArray和toString方法可以用于从Entity里读取完整的内容到byte数组或字符串里。但是,不建议这么做,除非Entity来自可信的服务器并且内容长度有限。
BufferedHttpEntity能将streamed Entity包装成self-contained Entity. 利用的是EntityUtils的toByteArray方法。
hc提供了一些HttpEntity的实现类用来创建请求体,例如StringEntity, ByteArrayEntity, InputStreamEntity, FileEntity. 其中,InputStreamEntity是not repeatable. 
UrlEncodedFormEntity用于构建表单请求体。


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值