说明

本文存在的原因,是想深入的学习下HttpClient。对应的网址是:

http://hc.apache.org/httpcomponents-client-4.5.x/primer.html

http://hc.apache.org/httpcomponents-client-4.5.x/tutorial/html/index.html

如果想学习怎么使用HttpClient,建议直接看官方给的例子:

http://hc.apache.org/httpcomponents-client-4.5.x/quickstart.html

简介

客户端HTTP编程入门,英文又叫 Client HTTP Programming Primer ,是专门针对缺少HTTP相关知识的人而准备的。注意,它仅仅是帮助你快速开始工作,过后仍然需要学习必要的知识。

虽然是说HttpClient,这里的概念也适用于HttpComponents或者Java的HttpURLConnection或者任何语言的任何HTTP通信库。所以,即便不使用Java和HttpClient,仍然是非常有用的。

场景

假定你有一些重复的、基于web的任务,你想让其实现自动化。例如:

  • 访问页面 http://a.b.c/login.html
  • 输入用户名和密码,点击登录按钮
  • 导航到特定的页面
  • 检查那个页面上的一些数据

这一次,我们没有一个特定的例子,所以,本文档都是空对空的讲述,你必须自己来写细节的东西。

附加说明

上面的场景,对于HTTP的使用来说,a bad practice。web站点被设计用于用户交互(UI),而非应用接口(API)。应该由浏览器展示。在B/S之间的HTTP通信是一个内部的API,不该被注意。

web站点可能随时更新设计,意味着你需要随时更改你的代码以确保正确执行。除非你使用的是那些公布出来的APIs,如检查新邮件等等。

不是一个浏览器(功能上可以看作一个浏览器!)

HttpClient不是一个浏览器!它是一个HTTP通信库,它仅提供了浏览器的部分功能。最根本的不同在于,HttpClient中没有UI。浏览器需要一个rendering引擎以展示页面、解释用户输入。有一个layout引擎,计算如何展示一个HTML页面,包括CSS和图片。一个Javascript解释器运行HTML中的或外部引用的js代码。UI的事件会被传给JavaScript解释器来处理。最顶层,有一些插件的接口,诸如处理Applets、PDF、movies、Flash等等。HttpClient只能被用于编码,通过使用其APIs来发送和接收HTTP消息。HttpClient的内容是完全不可知的。它能传递消息内容,但不能以任何方式渲染或处理它们。

另一个主要区别是,对bad input或HTTP标准的容忍度。浏览器需要容忍无效的用户输入,以更佳友好。HttpClient只遵守HTTP standard specification和相关的标准。它也提供了放松某些限制的手段,--按照标准所impose的。

名词

HTTP Message

HTTP消息,由请求行、请求头、请求体(可选)组成。有两种messages:requests 和 responses。他们的区别在于第一行。

HTTP Request

被发送到服务器的HTTP Message。第一行包括:目的URL、服务器应该执行该HTTP Message的方法。

HTTP Response

由服务器发送至客户端的HTTP Message,是对request的响应。第一行包含一个状态码。HTTP定义了一组状态码,例如200代表成功,404代表未找到。其他基于HTTP的协议也可以定义额外的状态码。

Method

服务器的一个操作,客户端请求的。HTTP定义了一组操作,最常用的是GET和POST。其他基于HTTP的协议可以定义额外的methods。

Header Fields

都是name-value对,且都是text。其name都是大小写不敏感的!多个values可以被赋给同一个name。RFC 2616定义了一个宽范围的header fields以处理HTTP协议的不同的aspects。其他的specifications,如RFC 2617 和 RFC2965,定义了更多的headers。一些是通用的,另一些是request或response专用的,还有一些是专门用于entity。

Entity

HTTP Message发送的data。例如,一个response可以包含你下载的页面或图像,将其作为一个entity,或者,一个request也能包括你输入到form中的parameters。HTTP Message的entity,可以有任意的data 格式,通常在一个header field中指定其MIME type。

Session

从某个源到一个服务器的一系列requests。服务器可以持有session data,并需要识别每个incoming request所属的session。

Cookies

是让服务器跟踪session的比较好的方式。服务器会在response中提供一些数据,cookie。服务器希望客户端在接下来的request的header field里携带那些数据。不同的session有不同的cookie,所以,服务器能够辨别出一个request属于哪个session,只要看一下cookie即可。

cookies在名为Set-Cookie或Set-Cookie2的header field中。

步骤

获取Login页面

为该页面创建一个GET request,并执行。

检查response,检查cookie。

建立Session

检查是否在request中携带了cookie,检查request headers即可。

HttpClient自动解析response中的cookie,并将其存入cookie store。HttpClient使用一个可配置的cookie政策来决定server发送的cookie是否正确。默认的政策严格执行RFC 2109,但很多服务器不执行!挨个执行cookie政策,直到cookie被接受并存入cookie store中。

如果cookie没有随新request一起发送,请检查HttpClient是否使用了相同的cookie store对象!除非你显式的管理cookie store对象(不建议新手这样做),否则不会出现这样的情况。

如果cookie还是没有随新request一起发送,检查你请求的URL是否在cookie的scope之内!cookies只会被发送到域名以及cookie scope中指定的path。例如,”jakarta.apache.org”的cookie 不会被发送至”tomcat.apache.org”。但 “.apache.org” 的 cookie可以被发送至二者。”apache.org”的cookie不会被发送至”tomcat.apache.org”。后一种情况可以通过使用不同的cookie spec来解决,例如添加前导点。

如果cookie随新request一起发送了,但服务器返回了新的cookie,请检查是否在request中存在该session cookie之外的cookies。一些服务器不能探测在各自独立的header fields中发送的多个cookies。HttpClient可以将所有的cookies放入一个单独的header field。

分析Form

method

指定提供form的method。默认GET。如果是GET,会将parameters追加到URL后面。如果是POST,会将parameters放入request的entity(也叫request body)。

action

指定request发送至的URL。

enctype=

指定request的entity(entity由form生成)的MIME type。两种常见情况下,url-encoded(默认)和multipart-mime。该attribute仅用于POST,GET一直是url-encoded。

accept-charset=

指定浏览器允许用户输入的character set。

一些header fields由HttpClient控制,不能显式的设置。其他header fields用于指示浏览器拥有的能力。

Host

由HttpClient控制。通常获取自你要访问的URL。也可能设置一个不同的值,”virtual host”。

Content-Type, Content-Length, Transfer-Encoding

由HttpClient控制。其值自request entity中获取。

Connection

通常由HttpClient控制,以处理connection keep-alive。不设置,或设为close。

Content-Encoding

用于指示处理压缩过的responses的能力。不要设置这个,除非你准备实现解压缩。

重定向

针对POST request,服务器返回303或307状态码是很常见的。这些重定向意味着你的应用必须发送另一个请求以获取结果。

HttpClient可被设置成自动重定向。因为RFC2616说自动重定向应由UI负责,我们遵守这个,但也不会阻止你实现不同的行为。redirect response中的Location header field,指示了实际需要访问的URL。虽然specification要求返回一个绝对路径,但返回相对URL也是很常见的。

HttpClient学习之 客户端HTTP编程入门的更多相关文章

  1. python编程学习--Pygame - Python游戏编程入门(0)---转载

    原文地址:https://www.cnblogs.com/wuzhanpeng/p/4261015.html 引言 博客刚开,想把最近学习的东西记录下来,算是一种笔记.最近打算开始学习Python,因 ...

  2. Linux学习 : Socket 网络编程入门

    一.socket()函数 int socket(int domain, int type, int protocol); domain:即协议域,又称为协议族(family).常用的协议族有,AF_I ...

  3. 3000字编程入门--附带Java学习路线及视频

    Title: 编程入门 GitHub: BenCoper Reference: 尚硅谷-2019 Study: 文字版+视频+实战(第一个自学的网站) Explain: 文末附带Java学习视频以及项 ...

  4. HttpClient客户端网络编程——高可用、高并发

    本文是HttpClient的学习博客,RestTemplate是基于HttpClient的封装,feign可基于HttpClient进行网络通信. 那么作为较底层的客户端网络编程框架,该怎么配置使其能 ...

  5. Python编程入门(第3版)|百度网盘免费下载|零基础入门学习资料

    百度网盘免费下载:Python编程入门(第3版) 提取码:rsd7 目录  · · · · · · 第1章 编程简介 11.1 Python语言 21.2 Python适合用于做什么 31.3 程序员 ...

  6. 大数据学习day18----第三阶段spark01--------0.前言(分布式运算框架的核心思想,MR与Spark的比较,spark可以怎么运行,spark提交到spark集群的方式)1. spark(standalone模式)的安装 2. Spark各个角色的功能 3.SparkShell的使用,spark编程入门(wordcount案例)

    0.前言 0.1  分布式运算框架的核心思想(此处以MR运行在yarn上为例)  提交job时,resourcemanager(图中写成了master)会根据数据的量以及工作的复杂度,解析工作量,从而 ...

  7. HttpClient学习整理

    HttpClient简介HttpClient 功能介绍    1. 读取网页(HTTP/HTTPS)内容    2.使用POST方式提交数据(httpClient3)    3. 处理页面重定向    ...

  8. HttpClient 学习整理【转】

    转自 http://www.blogjava.net/Alpha/archive/2007/01/22/95216.html HttpClient 是我最近想研究的东西,以前想过的一些应用没能有很好的 ...

  9. HttpClient 学习整理 (转)

    source:http://www.blogjava.net/Alpha/archive/2007/01/22/95216.html HttpClient 是我最近想研究的东西,以前想过的一些应用没能 ...

随机推荐

  1. 《TCP/IP具体解释卷2:实现》笔记--选路请求和选路消息

    内核的各种协议并不直接使用前面提供的函数来訪问选路树,而是调用几个函数:rtalloc和rtallocl是完毕路由表查询的两个 函数:rtrequest函数用于加入和删除路由表项:另外大多数接口在接口 ...

  2. WM_MOUSELEAVE 和 WM_MOUSEHOVER 使用

    原文链接: http://www.cnblogs.com/weiqubo/archive/2011/04/14/2016323.html 默认情况下,窗口是不响应 WM_MOUSELEAVE 和 WM ...

  3. Python count() 方法

    描述 count() 方法用于统计字符串中某个子字符串出现的次数,可选参数为开始搜索与结束搜索的位置索引. 语法 count() 方法语法: S.count(sub[,start=0[,end=len ...

  4. java的多线程(一)

    我们知道我们打开个程序(或者说运行一款软件)其实也就是创建了一个进程,只不过程序是静态指令的集合,而进程是正在系统中运行的指令集合,进程是系统进行资源分配与调度的一个独立单位.进程具有独立性,动态性, ...

  5. Eclipse使用git最基本流程(提交远程仓库的方法)

    注册一个github账号 注册完成之后,点击右上角的settings(就是那个齿轮,设置的图标) Step6 Egit的使用 首先,登入你的github账号,点击加号,选择New repositror ...

  6. 在Spring中注入Java集合

    集合注入重要是对数组.List.Set.map的注入,具体注入方法请参照一下代码(重点是applicationContext.xml中对这几个集合注入的方式): 1.在工程中新建一个Departmen ...

  7. rpm -e 包名 卸载安装的二进制包

    rpm -e --nodeps nc-.el6.x86_64 #--nodeps 不包含依赖包,直接删除rpm包

  8. JVM ,Java paper

    http://files.cnblogs.com/files/WCFGROUP/IntroductiontoCompilerConstructioninaJavaWorld.pdf A Fast Wr ...

  9. mysql 5.7.14 安装配置方法图文教程(转)

    http://www.jb51.net/article/90259.htm ******************************** 因笔者个人需要需要在本机安装Mysql,先将安装过程记录如 ...

  10. LeetCode: Sort List 解题报告

    Sort List Sort a linked list in O(n log n) time using constant space complexity. 使用Merge Sort, 空间复杂度 ...