HttpClient——概述(一)

一、HttpClient scope

1.Client-side HTTP transport library based on HttpCore
2.Based on classic (blocking) I/O
3.Content agnostic

二、HttpClient能做什么?

1.HttpClient不是浏览器
2.HttpClient只能发送、接收请求,传输数据
3.HttpClient不解析返回数据

支持的请求类型
GET, HEAD, POST, PUT, DELETE, TRACE and OPTIONS.
对应的方法类型
HttpGet,HttpHead, HttpPost, HttpPut, HttpDelete, HttpTrace, HttpOptions.

三、执行请求的基本代码块

CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpget = new HttpGet("http://localhost/");
CloseableHttpResponse response = httpclient.execute(httpget);
try {
    <...>
} finally {
    response.close();
}

四、Http Request URI的组成与HTTP请求

HTTP request URIs consist of a protocol scheme, host name, optional port, resource path, optional query, and optional fragment.

URI uri = new URIBuilder()
        .setScheme("http")
        .setHost("www.google.com")
        .setPath("/search")
        .setParameter("q", "httpclient")
        .setParameter("btnG", "Google Search")
        .setParameter("aq", "f")
        .setParameter("oq", "")
        .build();
HttpGet httpget = new HttpGet(uri);
System.out.println(httpget.getURI());

stdout

http://www.google.com/search?q=httpclient&btnG=Google+Search&aq=f&oq=

五、HTTP Response(这个是指我们调用接口后需要返回消息体给对方)

HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,
HttpStatus.SC_OK, "OK");

System.out.println(response.getProtocolVersion());
System.out.println(response.getStatusLine().getStatusCode());
System.out.println(response.getStatusLine().getReasonPhrase());
System.out.println(response.getStatusLine().toString());

stdout

HTTP/1.1
200
OK
HTTP/1.1 200 OK

六、设置响应头

读取head的时候有两种方式:
方式一:

HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,
    HttpStatus.SC_OK, "OK");
response.addHeader("Set-Cookie",
    "c1=a; path=/; domain=localhost");
response.addHeader("Set-Cookie",
    "c2=b; path=\"/\", c3=c; domain=\"localhost\"");
Header h1 = response.getFirstHeader("Set-Cookie");
System.out.println(h1);
Header h2 = response.getLastHeader("Set-Cookie");
System.out.println(h2);
Header[] hs = response.getHeaders("Set-Cookie");
System.out.println(hs.length);

方式二: 使用HeaderIterator

HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,
    HttpStatus.SC_OK, "OK");
response.addHeader("Set-Cookie",
    "c1=a; path=/; domain=localhost");
response.addHeader("Set-Cookie",
    "c2=b; path=\"/\", c3=c; domain=\"localhost\"");

HeaderIterator it = response.headerIterator("Set-Cookie");

while (it.hasNext()) {
    System.out.println(it.next());
}

七、HTTP Entity (HTTP消息实体)

消息体存在于请求体或者响应体中,HttpClient通过内容的源来区分三种消息体:
streamed:
The content is received from a stream, or generated on the fly. Streamed entities are generally not repeatable.
self-contained:
Self-contained entities are generally repeatable, will be mostly used for entity enclosing HTTP requests
wrapping:
The content is obtained from another entity.
补充:The HTTP specification defines two entity enclosing request methods: POST and PUT.

处理流类型消息体时,注意释放资源

CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpget = new HttpGet("http://localhost/");
CloseableHttpResponse response = httpclient.execute(httpget);
try {
    HttpEntity entity = response.getEntity();
    if (entity != null) {
        InputStream instream = entity.getContent();
        try {
            // do something useful
        } finally {
            instream.close();
        }
    }
} finally {
    response.close();
}

The difference between closing the content stream and closing the response is that the former will attempt to keep the underlying connection alive by consuming the entity content while the latter immediately shuts down and discards the connection.
译:关闭流消息体和关闭响应的区别是前者通过消费(读取)消息体的内容的方式尝试保持连接的存活,而后者则是立即断开连接。—— (有待于纠正)

在我们使用streaming entities时,我们也可以使用EntityUtils.consume(HttpEntity) 方法来确保消息体的内容全部被读完(or has been fully consumed),并且Stream连接已经关闭。

处理包装类型的资源:(使用背景:在我们想多次使用content的时候我们需要缓存资源)

CloseableHttpResponse response = <...>
HttpEntity entity = response.getEntity();
if (entity != null) {
    entity = new BufferedHttpEntity(entity);
}

未完待续....

时间: 2024-10-26 12:12:06

HttpClient——概述(一)的相关文章

Windows 8 Store Apps学习(61) 通信: http, oauth

介绍 重新想象 Windows 8 Store Apps 之 通信 HttpClient 概述 http get string http get stream http post string http post stream OAuth 2.0 验证的客户端 示例 用于演示 http 通信的服务端 WebServer/HttpDemo.aspx.cs /* * 用于响应 http 请求 */ using System; using System.IO; using System.Threadi

重新想象 Windows 8 Store Apps (61) - 通信: http, oauth

原文:重新想象 Windows 8 Store Apps (61) - 通信: http, oauth [源码下载] 重新想象 Windows 8 Store Apps (61) - 通信: http, oauth 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 通信 HttpClient 概述 http get string http get stream http post string http post stream OAuth 2.0 验证的客户端 示

【Android】Android网络编程概述

Android网络编程概述 原文来自:http://blog.csdn.net/kieven2008/article/details/8210737 首先,应该了解的几个问题: 1)Android平台网络相关API接口  a) java.net.*(标准Java接口)  java.net.*提供与联网有关的类,包括流.数据包套接字(socket).Internet协议.常见Http处理等.比如:创建URL,以及URLConnection/HttpURLConnection对象.设置链接参数.链接

第1章 开发环境安装和配置(一):概述

原文 第1章 开发环境安装和配置(一):概述 目前Android在全世界市场上大约有75%的占有率,国人Android手机的持有比例更甚,甚至达到90%以上[网上找的介绍,不必在意]. 用C#开发手机应用程序,建议首选VS2015,这是因为VS2015内置的是C# 6.0,很多原来实现起来比较繁琐的操作,在VS2015下也都变得非常简单了. 1.跨平台移动应用开发 VS2015的移动跨平台采用Xamarin架构,这让原本就熟悉Visual Studio的开发者不用再熟悉其他的开发工具就能直接开发

黑马程序员 一、java 概述与基础知识

获取更多资源关注Java帮帮IT资源分享网 一.黑马程序员-java 概述与基础知识 1.何为编程? 编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果 的过程. 为了使计算机能够理解人的意图,人类就必须要将需解决的问题的思路.方法.和手段通 过计算机能够理解的形式告诉计算机,使得计算机能够根据人的指令一步一步去工作,完 成某种特定的任务.这种人和计算机之间交流的过程就是编程.   2.Java 语言概述,历史.特点 是 SUN(Stanford Universit

Java基础-01总结概述,dos,功能键,path

你需要的是什么,直接评论留言. 获取更多资源加微信公众号"Java帮帮" (是公众号,不是微信好友哦) 还有"Java帮帮"今日头条号,技术文章与新闻,每日更新,欢迎阅读 学习交流请加Java帮帮交流QQ群553841695 分享是一种美德,分享更快乐! 1:计算机概述(了解) (1)计算机(2)计算机硬件(3)计算机软件系统软件:window,linux,mac应用软件:qq,yy,飞秋(4)软件开发(理解)软件:是由数据和指令组成的.(计算器)开发:就是把软件做

ETL概述(原创)

ETL概述ETL,Extraction- Transformation-Loading的缩写,即数据抽取(Extract).转换(Transform).装载(Load)的过程,它是构建数 据仓库的重要环节.ETL是将业务系统的数据经过抽取.清洗转换之后加载到数据仓库的过程,目的是将企业中的分散.零乱.标准不统一的数据整合到一起,为 企业的决策提供分析依据.ETL是BI项目重要的一个环节.通过ETL,我们可以基于源系统中的数据来生成数据仓库.ETL为我们搭建了OLTP系统和 OLAP系统之间的桥梁

gecko框架概述

1 gecko概述 最近在研究metaq消息队列,它里面用到的NIO通信框架是gecko,文档是这么描述的 Gecko是一个Java NIO的通讯组件,它在一个轻量级的NIO框架的基础上提供了更高层次的封装和功能. 支持的RPC调用方式包括RR(request-response)和pipeline. 0 可插拔的协议设计 1 连接池 2 分组管理和负载均衡 3 Failover/Retry 4 重连管理 5 同步和异步调用 本文就按照日常NIO通信框架和RPC所面临的问题来看下gecko是怎么解

Java编程那些事儿101——网络编程概述

第十三章 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在学习网络编程以前,很多初学者可能觉得网络编程是比较复杂的系统工程,需要了解很多和网络相关的基础知识,其实这些都不是很必需的.首先来问一个问题:你会打手机吗?很多人可能说肯定会啊,不就是按按电话号码,拨打电话嘛,很简单的事情啊!其实初学者如果入门网络编程的话也可以做到这么简单! 网络编程就是在两个或两个以上的设备(例如计算机)之间传输