说明

本文存在的原因,是想深入的学习下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. W5500初始化过程

  2. Linux下的MongoDB安装配置以及基本用法示例

    一 MongoDB的安装配置 (1)下载并安装: MongoDB安装包下载地址:https://www.mongodb.com/download-center [root@localhost src] ...

  3. IP和java.net.InetAddress类的使用

    一.IP 1.地址格式 互联网上每一台计算机都有一个唯一标示自己的标记,这个标记就是IP地址.IP 地址使用32 位长度二进制数据标示,一般在实际中看到的大部分IP地址都是以十进制的数据形式标示的,如 ...

  4. 【Android】17.2 Activity与Local Service的绑定

    分类:C#.Android.VS2015: 创建日期:2016-03-03 一.简介 如果服务是你的应用程序所私有的,即服务(Service)与客户端(Activity)都在同一个项目中(大部分应用程 ...

  5. ie浏览器不兼容css媒体查询的解决办法

    有些页面布局复杂,在不同分辨率下表现需要一致,这时需要用媒体查询根据不同分辨率进行百分比定位(不能用像素定位),如: @media screen and (max-width: 1600px) { . ...

  6. https编程遇到PKIX:unable to find valid certification path to requested target 的问题

    https编程遇到PKIX:unable to find valid certification path to requested target 的问题 2016-12-01 解决方案见:解决PKI ...

  7. 终端模拟工具:Xshell 4

    终端模拟工具:Xshell 4 2016-09-20 目录 1 安装 2 配置 3 命令 Xshell 是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Window ...

  8. java 从数据库取值反射给变量

    在 javaweb开发中,往往一些通用的属性都定义到常量类中,而常量类中的常量又怎么赋初始值呢,可以再配置文件,可以直接赋值,可以在webstart的时候从数据库查询出来数据赋值 从数据库查询数据出来 ...

  9. dp之混合背包poj1742(推荐)

    题意:给你价值为a1,a2.....的货币,每种有c1,c2.......个,求这些货币所能组成的价值小于等于m有多少个..... 思路:很像一道多重背包题?那我一开始的确是用多重背包的思路编写的.. ...

  10. org.eclipse.jdt.internal.compiler包下的类找不到

    到maven库上下载jar包:org.eclipse.jdt.core-3.13.jar <!-- https://mvnrepository.com/artifact/org.eclipse. ...