连续三天外出听讲座,httpclient的学习耽误了。今天学习字符编码、cookie处理部分以及如何排错。

  

1、字符编码(character encoding)



  一个HTTP协议的请求或应答的头部(在http协议中,数据包分为两部分,一部分是头部,由一些名值对构成,一部分是主体(body),是真正传办理的数据(如HTML页面等)),必须以US-ASCII编码,这是因为头部不传数据而只描述被要传输的数据的一些信息,一个例外是cookie,它是数据但是通过头部进行传输的,所以它也要用US-ASCII编码。


  HTTP数据包的主体部分,可以用任何一种方式进行编码,默认是ISO-8859-1,具体可以用头部字段Content-Type指定。可以利用 addRequestHeader方法,设定编码方式;用 getResponseCharSet取得编码方式。对HTML或XML等类型的文档,它们的本身的Content-Type也可以指定编码方式,主要区分两者的作用范围以得到正确实的解码。


  URL的编码标准,由RFC1738指定为,只能是由可打印8位/字节的us-ascii字符组成,80-ff不是us-ascii字符,而00-1F是控制字符,这两个区域中用的字符都须加以编码(encoded)。


  

2、Cookies



   HttpClient能自动管理cookie,包括允许服务器设置cookie并在需要的时候自动将cookie返回服务器,它也支持手工设置cookie后发送到服务器端。不幸的是,对如何处理cookie,有几个规范互相冲突:Netscape Cookie 草案, RFC2109, RFC2965,而且还有很大数量的软件商的cookie实现不遵循任何规范. 为了处理这种状况,HttpClient提供了策略驱动的cookie管理方式。HttpClient支持的cookie规范有:

  1. Netscape cookie草案,是最早的cookie规范,基于rfc2109。尽管这个规范与rc2109有较大的差别,这样做可以与一些服务器兼容。
  2. rfc2109,是w3c发布的第一个官方cookie规范。理论上讲,所有的服务器在处理cookie(版本1)时,都要遵循此规范,正因如此,HttpClient将其设为默认的规范。遗憾的是,这个规范太严格了,以致很多服务器不正确的实施了该规范或仍在作用Netscape规范。在这种情况下,应使用兼容规范。
  3. 兼容性规范,设计用来兼容尽可能多的服务器,即使它们并没有遵循标准规范。当解析cookie出现问题时,应考虑采用兼容性规范。


   RFC2965规范暂时没有被HttpClient支持(在以后的版本为会加上),它定义了cookie版本2,并说明了版本1cookie的不足,RFC2965有意有久取代rfc2109.


  在HttpClient中,有两种方法来指定cookie规范的使用,

  1. HttpClient client = new HttpClient();
    client.getState().setCookiePolicy(CookiePolicy.COMPATIBILITY); 这种方法设置的规范只对当前的HttpState有效,参数可取值CookiePolicy.COMPATIBILITY,CookiePolicy.NETSCAPE_DRAFT或CookiePolicy.RFC2109。
  2. System.setProperty("apache.commons.httpclient.cookiespec", "COMPATIBILITY"); 此法指的规范,对以后每个新建立的HttpState对象都有效,参数可取值"COMPATIBILITY","NETSCAPE_DRAFT"或"RFC2109"。
      常有不能解析cookie的问题,但更换到兼容规范大都能解决。
3、使用HttpClient遇到问题怎么办?

  1. 用一个浏览器访问服务器,以确认服务器应答正常
  2. 如果在使代理,关掉代理试试
  3. 另找一个服务器来试试(如果运行着不同的服务器软件更好)
  4. 检查代码是否按教程中讲的思路编写
  5. 设置log级别为debug,找出问题出现的原因
  6. 打开wiretrace,来追踪客户端与服务器的通信,以确实问题出现在什么地方
  7. 用telnet或netcat手工将信息发送到服务器,适合于猜测已经找到了原因而进行试验时
  8. 将netcat以监听方式运行,用作服务器以检查httpclient如何处理应答的。
  9. 利用最新的httpclient试试,bug可能在最新的版本中修复了
  10. 向邮件列表求帮助
  11. 向bugzilla报告bug.