1.1.4 处理HTTP状态码
上一节介绍HttpClient访问Web资源的时候,涉及HTTP状态码。比如下面这条语句:
int statusCode=httpClient.executeMethod (getMethod);//回车,获得响应状态码
HTTP状态码表示HTTP协议所返回的响应的状态。比如客户端向服务器发送请求,如果成功地获得请求的资源,则返回的状态码为200,表示响应成功。如果请求的资源不存在,则通常返回404错误。
HTTP状态码通常分为5种类型,分别以1~5五个数字开头,由3位整数组成。1XX通常用作实验用途。这一节主要介绍2XX、3XX、4XX、5XX等常用的几种状态码,如表1.1所示。
表1.1 HTTP常用状态码
状态代码 |
代码描述 |
处理方式 |
200 |
请求成功 |
获得响应的内容, 进行处理 |
201 |
请求完成,结果是创建了新资源。 新创建资源的URI可在响 应的实体中得到 |
爬虫中不会遇到 |
202 |
请求被接受,但处理尚未完成 |
阻塞等待 |
204 |
服务器端已经实现了请求, 但是没有返回新的信息。如果 客户是用户代理,则无须为此 更新自身的文档视图 |
丢弃 |
300 |
该状态码不被HTTP/1.0的应 用程序直接使用,只是作为 3XX类型回应的默认解释。 存在多个可用的被请求资源 |
若程序中能够处理, 则进行进一步处理, 如果程序中不能 处理,则丢弃 |
301 |
请求到的资源都会分配一 个永久的URL,这样就可以 在将来通过该URL来访问此资源 |
重定向到分配的URL |
302 |
请求到的资源在一个不同 的URL处临时保存 |
重定向到临时的URL |
304 |
请求的资源未更新 |
丢弃 |
400 |
非法请求 |
丢弃 |
401 |
未授权 |
丢弃 |
403 |
禁止 |
丢弃 |
404 |
没有找到 |
丢弃 |
5XX |
回应代码以“5”开头的状态 码表示服务器端发现自己出现错误, 不能继续执行请求 |
丢弃 |
当返回的状态码为5XX时,表示应用服务器出现错误,采用简单的丢弃处理就可以解决。
当返回值状态码为3XX时,通常进行转向,以下是转向的代码片段,读者可以和上一节的代码自行整合到一起:
//若需要转向,则进行转向操作 if ((statusCode == HttpStatus.SC_MOVED_TEMPORARILY) || (statusCode == HttpStatus.SC_MOVED_PERMANENTLY) || (statusCode == HttpStatus.SC_SEE_OTHER) || (statusCode == HttpStatus.SC_TEMPORARY_REDIRECT)) { //读取新的URL地址 Header header = postMethod.getResponseHeader("location"); if(header!=null){ String newUrl = header.getValue(); if(newUrl==null||newUrl.equals("")){ newUrl="/"; //使用post转向 PostMethod redirect = new PostMethod(newUrl); //发送请求,做进一步处理…… } } }
当响应状态码为2XX时,根据表1.1的描述,我们只需要处理200和202两种状态码,其他的返回值可以不做进一步处理。200的返回状态码是成功状态码,可以直接进行网页抓取,例如:
//处理返回值为200的状态码 if (statusCode == HttpStatus.SC_OK) { input = postMethod.getResponseBodyAsStream(); //得到文件名 String filename = path.substring(path.lastIndexOf('/')+1); //获得文件输出流 output = new FileOutputStream(filename); //输出到文件 int tempByte = -1; while((tempByte=input.read())>0){ output.write(tempByte); } }
202的响应状态码表示请求已经接受,服务器再做进一步处理。
转自:http://www.cnblogs.com/TankXiao/archive/2013/01/08/2818542.html
还有一篇比较好的介绍:http://www.cnblogs.com/TankXiao/archive/2013/01/08/2818542.html