协议编码方式

来源:互联网 发布:c语言强制转换长整型 编辑:程序博客网 时间:2024/06/07 19:25

smtp:

    传送ascii码,所以mime编码,quote-printable,base64编码

http:

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.