HTTP

HTTP状态码分类

1xx:信息

2xx:请求成功

3xx:重定向

4xx:客户端错误

5xx:服务器错误

常见的HTTP状态码

301:永久重定向

302:临时重定向

400:客户端请求语法错误,服务端无法理解(Bad Request)

401:请求未经授权,客户端需要进行身份认证(UnAuthorized)

403:客户端无权限访问,服务端拒绝提供服务(Forbidden)

404:客户端请求资源不存在,未找到请求的URL(NOT FOUND),例如输错了URL

500:服务器遇到了错误,无法为请求提供服务

503:服务器目前无法为客户端的请求提供服务,但过一段时间就可以恢复服务

HTTP报文类型

HTTP请求报文:请求行、请求报头、空行、请求体

HTTP响应报文:状态行、响应报头、空行、响应体

请求行和状态行

请求行:请求方法 + 请求URI + 请求的HTTP协议版本
eg:GET  http://www.baidu.com  HTTP/1.1

状态行:服务器的HTTP协议版本 + 响应状态码 + 状态码的文本描述
eg:HTTP/1.1  200  OK

HTTP消息报头

通用报头

Date:表示消息产生的日期和时间
Connection:允许客户端和服务器指定与请求/响应连接有关的选项,如设置为Keep-Alive保持长连接
Cache-Control:指定缓存指令

请求报头

Host:请求的主机名
User-Agent:发送请求的浏览器类型、操作系统等信息
Accept:客户端可识别的数据类型,用于指定客户端允许接收哪些类型的信息
AcceptEncoding:客户端可识别的数据编码,如设置为Gzip表示支持透明压缩
Transfer-Encoding:指定传输报文的编码方式

响应报头

Location:重定向
Server:服务器的操作系统等信息

实体报头

Content-Type:请求数据的数据类型(text/html、image/gif、application/xml等  )
Content-Length:实体正文的长度
Content-Language:描述的自然语言
Content-Encoding:用于媒体类型的编码
Expired:响应过期的日期和时间

URLConnection

URLConnection是一个抽象类,表示指向URL指定资源的连接。与URL类相比,URLConnection类对与HTTP服务器的交互提供了更多的控制:

1、URLConnection可以访问服务器响应的首部信息
2、URLConnection可以设置客户端请求的首部信息
3、URLConnection除了能读取服务器响应的数据外,还能向服务器写入数据

使用URLConnection的步骤:

1、构造一个URL对象;
2、调用URL对象的openConnection()方法获取一个URLConnection对象;
3、对URLConnection进行配置(如果默认配置则直接跳过此步骤);
4、读取首部字段(如果服务器没有返回首部字段则直接跳过此步骤);
5、调用URLConnection对象的getInputStream()方法获取输入流并读取数据;
6、调用URLConnection对象的getOutputStream()方法获取输出流并写入数据;
7、关闭连接;

URLConnection类真正进行连接的方法:

URLConnection类为抽象类,不过除了connect()方法之外,其它方法均已实现,所以子类必须实现connect()方法。该方法真正起到建立与服务器连接的作用,因而依赖于服务类型(HTTP、FTP等)。第一次构造URLConnection是,它是未连接的,本地和远程主机无法发送和接受数据,必须等到connect()方法被调用,在本地和远程主机之间建立一个连接(一般是TCP Socket连接),才能真正收发数据。当getInputStream()、getOutputStream()方法、读取首部方法被调用时会自动调用connect()方法,所以一般不用显示调用connect()进行连接。

读取HTTP首部的方法:

1、getContentType():读取Content-Type字段,该方法返回响应主体的MIME内容类型,如果服务器没有返回内容类型,则返回null。由于该方法返回的Content-Type字段通常包含字符编码集,所以可以通过读取HTTP首部中指定的编码方式对文档进行解码,如果没有指定编码方式,则使用ISO-8859-1(HTTP的默认编码方式)

2、getContentLength():读取Content-Length字段,该方法返回响应主体内容的字节数,如果服务器没有返回内容长度,则返回-1。如果要下载一个二进制文件,更可靠的做法是通过getContentLength()得到文件的长度,然后根据这个文件的长度读取相应的字节数,避免出现HTTP服务器并不总是会在数据发送完成之后就立即关闭连接而导致不知何时停止读取的情况

3、getContentEncoding():读取Content-Encoding字段,该方法返回响应主体的内容编码方式,如果没有返回编码方式,则返回null。最常用的编码方式是Gzip,可以使用GZIPInputStream类直接解码

4、getDate():读取Date字段,该方法返回一个long类型,指出响应发送的时间(服务器的时间),如果没有返回发送时间,则返回0。可以把long类型转换为java.util.Date类型

5、getExpiration():读取Expires字段,该方法返回一个long类型,指出响应数据的过期时间(服务器的时间),如果没有返回过期时间,则返回0表示不会过期。该字段最常用来指示应当何时删除缓存中的数据,并且从服务器下载最新的数据

6、getLastModified():读取Last-Modified字段,该方法返回一个long类型,指出响应主体返回数据的最后修改日期,如果没有返回最后修改日期,则返回0,。

7、getHeaderField(String name):返回指定首部字段的值,首部字段不区分大小写,返回的是String类型,如果是获取时间的话可以将String转化为long或int值。

8、getHeaderField(int n):返回第n个首部字段的值,注意请求行和状态行表示第0个首部字段。如在HTTP响应中getHeaderField(0)表示状态行:HTTP/1.1 200 OK

涉及缓存的首部字段:

默认情况下,一般认为使用GET通过HTTP访问的页面可以缓存,主要涉及四个字段:

1、Expires:指定缓存过期的时间;
2、Cache-Control:指定缓存策略;
3、Last-Modified:指示资源最后一次修改时间;
4、Etag:资源改变时这个资源的唯一标识符;

客户端缓存的策略:

1、如果本地缓存中这个资源的一个表示,而且还没有到它的过期时间,那么可以直接从本地缓存中读取这个资源,而无需与服务器交互;
2、如果本地缓存中这个资源的一个表示,不过它已经过期了,在完成完整的GET之前,可以检查服务器的HEAD首部,查看资源是否已经改变;

URLConnection连接配置:

URLConnection类有7个受保护的实例字段,定义了客户端如何向服务器发起请求,这些字段都提供了相应的get/set方法:

protected URL url    指定了URLConnection连接的Url
protected boolean doInput = true    读取服务器
protected boolean doOutput = false    写入服务器
protected boolean allowUserInteraction = false    是否需要与用户交互
protected boolean useCaches = true    是否开启缓存
protected long ifModifiedSince = 0    客户端最后获取数据的时间
protected boolean connected = false    连接的状态

注意只能在URLConnection连接之前设置这些字段(试图从连接读取内容或首部之前),如果设置时连接已经打开,则会抛出IllegalStateException异常。在向服务器写入数据时,必须调用setDoOutput(true)方法置为true。

另外有四个方法可以设置超时值,分别是控制Socket等待建立连接的超时时间,控制输入流等待数据到达的超时时间:

public void setConnectTimeout(int timeout)
public void setReadTimeout(int timeout)

URLConnection配置HTTP请求首部:

public void setRequestProperty(String key, String value)    设置首部字段(会覆盖)
public void addRequestProperty(String key, String value)    添加首部字段
public String getRequestProperty(String key)    获取指定首部字段的值
public Map<String,List<String>> getRequestProperties()    获取全部首部字段值


HTTPURLConnection

HTTPURLConnection类是URLConnection的抽象子类,它对URLConnection进行了功能扩展,提供了另一些方法在处理HTTP时很有用。具体的功能扩展为:

1、可以获取和设置请求方法
2、确定是否重定向
3、获取响应码和对应的响应描述
4、确定是否使用代理服务器
5、包括了几十个便于记忆的常量,对应于HTTP的各种响应码

直接强制转换openConnection()的返回值为HTTPURLConnection即可得到对应的对象。

请求方法:

public void setRequestMethod(String method)
可以通过该方法设置请求方法,在默认情况下会使用GET方法。

HEAD:这个方法与GET非常相似,唯一的区别是HEAD只返回HTTP首部,不返回具体的数据内容。最常用于检查文件在最后一次缓存之后是否有修改。

OPTIONS:作用是询问请求的某个特定URL支持哪些选项(允许向服务器发送的请求苟方法),如果请求的URL是(*),则这个请求将作用于整个服务器而不是服务器中某个特定的URL。OPTIONS请求可以在响应头部的Allow字段中查看选项列表,如Allow:GET,HEAD,POST,OPTIONS,TRACE。

TRACE:这个方法会发送客户端的HTTP请求首部,服务器将从客户端接收这个HTTP首部,之所以需要这个信息,主要原因是查看服务器和客户端之间的代理服务器做了哪些修改。

获取响应信息的方法:

public int getResponseCode()    获取响应状态码

public String getResponseMessage()    获取响应状态消息

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335