说明

本文存在的原因,是想深入的学习下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. Externalizable的使用方法

    package com.itbuluoge.object; import java.io.Externalizable; import java.io.FileInputStream; import ...

  2. 从错误中学python(4)——最小公约数与辗转相除法

    题目 给你两个正整数a和b, 输出它们的最大公约数 辗转相除法 辗转相除法的步骤 def gcd(b,a): b,a=a,b%a if a==0: return b else: return gcd( ...

  3. 使用matlab处理图像的基础知识

    MATLAB基本函数一 矩阵运算 1.基本算数运算(加减乘除) + -运算要求矩阵维数相同,例m*n * /运算,例A=B*C,B矩阵是m*n矩阵,B是n*p矩阵,则A是m*p矩阵 A/B相当于A*i ...

  4. 深入Javascript中apply、call、bind

    最近在看一下node package的源码,发现很多里面都包含了function这个对象的apply.call.bind这三个方法,于是想拿出来再看看.. apply.call 在 javascrip ...

  5. MYSQLDUMP参数详解(转)

    mysqldump客户端可用来转储数据库或搜集数据库进行备份或将数据转移到另一个SQL服务器(不一定是一个MySQL服务器).转储包含创建表和/或装载表的SQL语句. 如果你在服务器上进行备份,并且表 ...

  6. TCP协议具体解释(上)

     TCP协议具体解释 3.1 TCP服务的特点 TCP协议相对于UDP协议的特点是面向连接.字节流和可靠传输. 使用TCP协议通信的两方必须先建立链接.然后才干開始数据的读写.两方都必须为该链接分 ...

  7. 【Android】3.4 图层展示

    分类:C#.Android.VS2015.百度地图应用: 创建日期:2016-02-04 3.4 示例4--图层展示 一.简介 1.地图类型 百度地图Android SDK 3.7.1提供了两种类型的 ...

  8. python 使用py2exe将python 脚本生成exe可执行文件

    使用python的py2exe模块可以很容易地帮助我们将python脚本生成可执行的exe程序.这样我们就可以让脚本脱离虚拟机的束缚,从而独立运行. 首先安装py2exe分解步骤如下:(pip和eas ...

  9. 每日英语:Can Going In and Out of Air Conditioning Cause Colds?

    For most people, summer involves numerous daily shifts between scorching outdoor heat and frosty air ...

  10. Solr学习之三 solr配置说明之一

    严格来说,我这篇内容,主要是根据Solr in Action关于配置的说明,以及参考Solr的wiki写的算是读书笔记吧,所有的图片默认来自Solr in Action这本书. 这本书我觉得对学习So ...