说明

本文存在的原因,是想深入的学习下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. spring3.0.6+hibernate3升级spring4.1.6+hibernate4.3遇到的问题

    1.下面这三个包,在hibernate4中已经废弃了,因为都直接用session来进行很好的事务管理 import org.springframework.orm.hibernate3.Hiberna ...

  2. Linux 普通进程 后台进程 守护进程(转)

    一.普通进程与后台进程 默认情况下,进程是在前台运行的,这时就把shell给占据了,我们无法进行其它操作.对于那些没有交互的进程,很多时候,我们希望将其在后台启动,可以在启动参数的时候加一个'& ...

  3. mysql-5.7 调整mysql的复制方式由master_log_file+master_log_pos 到gtid 详解

    一.祖传的master_log_file + master_log_pos的复制方式面临的问题: 在很久以前 那个时候我还没有出道,mysql就已经就有复制这个功能了.如果要告诉slave库从mast ...

  4. Java中弹出框的集中方式

    1.显示一个错误对话框,该对话框显示的 message 为 'alert': JOptionPane.showMessageDialog(null, "alert", " ...

  5. Spring中xml文件配置也可以配置容器list、set、map

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  6. php 多进程解决代码常驻内存的问题php 多进程解决代码常驻内存的问题

    PHP不适合做常驻的SHELl进程,因为它没有专门的gc例程,也没有有效的内存管理途径. 如果用PHP做常驻SHELL,会经常被内存耗尽导致abort而unhappy. 而且,如果输入数据非法,而脚本 ...

  7. 简易C#动态加载dll(实现插件化)

    可以通过该方法来实现程序插件化. 假设A,B两个类,A类为宿主,B类为插件需要加载到A类中: class Program { public interface IHellow { void Hello ...

  8. 【Android】11.6 Fragments基本用法示例

    分类:C#.Android.VS2015: 创建日期:2016-02-22 一.简介 该例子演示了如何使用两个fragment创建双区域布局的activity(纵向和横向).在这个activity包含 ...

  9. 认识k_BackingField,微软自己的序列化和反序列化

    事情从Json的序列化和反序列化说起. 在C#2.0的项目中,以前经常使用Json.Net实现序列化和反序列化.后来从c#3.0中开始使用新增的DataContractJsonSerializer进行 ...

  10. ORACLE 多列合并成一行数据 WM_CONCAT函数以及REPLACE

    WM_CONCAT()方法 注意字符长度 SELECT BERTHCODE,tpf.freedatetype, ( SELECT WM_CONCAT(SBPT.PARKSTIME||'~'||SBPT ...