首页 > 代码库 > 简介HTTP协议及及应用

简介HTTP协议及及应用

   1、概述

  Web客户端(或浏览器)和服务器之间的交互用的是一个基于本文的应用级协议,叫做HTTP。

  客户端利用TCP发起一个HTTP请求到服务器上指定端口(默认端口为80),服务器响应所请求的内容,并关闭连接。对于Web客户端和服务器而言,内容是与一个MIME类型相关的字节序列。常用的MIME(多用途的网际邮件扩充协议)类型有:text/html(HTML页面)、text/plain、application/postscript、image/gif、image/jpeg(JPEG格式编码的二进制图像)。

  Web服务器以两种不同的方式向客户端提供内容:

    *取一个磁盘文件,并讲它的内容返回给客户端,即服务静态内容。

    *运行一个可执行文件,并将它的输出返回给客户端,即服务动态内容。

  2、About URL

  由上文可见Web服务器返回的内容都是和它管理的文件相关连的,而每一个文件都有一个唯一的名字,叫做URL(通用资源定位符)。

如,http://www.google.com:80/index.html  表示主机www.google.com上的一个名为index.html的HTML文件,它是由一个监听端口80的Web服务管理的。(那么问题来了,为啥只输入"http://www.google.com"也可以访问内容?因为浏览器在后面添加了"/",传给服务器后,服务器又拓展为某个默认的主页。而端口号是可选的,默认为80)。

可执行文件的URL可以在文件后包括程序参数,用"?"来分割文件名和参数,每个参数都用"&"字符分隔开。确定一个URL指向的是静态还是动态内容没有标准的规则。一种常见的方法是,将他们放在不同组目录下。

  3、HTTP事务

  3.1 HTTP请求

  在HTTP/1.0中只定义了GET、POST和HEAD三种方法(也叫“动作”),来操作指定的资源。

  而HTTP/1.1协议将其扩展到了八种,包括:

  • POST:向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。
  • GET:向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例如在Web Application中。其中一个原因是GET可能会被网络蜘蛛等随意访问。
  • OPTIONS:这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用‘*‘来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。
  • HEAD:与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部份。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。
  • PUT:向指定资源位置上传其最新内容。
  • DELETE:请求服务器删除Request-URI所标识的资源。
  • TRACE:回显服务器收到的请求,主要用于测试或诊断。
  • CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。

 

其中GET和POST方法最为常见:

 

GET方法常用来取得HTML文档或图形,或根据用户提交的搜索项目取得搜索结果。GET请求在URL中向服务器发信息,如,fredzzt.cn/search?name=value&name1=value1。IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。

 

POST方法是将信息发送到服务器上,如验证码或从用户输入表单中收集的数据。POST方法以HTTP消息发送表单数据(而不是URL),由于将数据嵌入HTTP消息中,从而对用户隐藏更加安全。

 

 二者的更多区别:http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html

  3.2 HTTP响应

  HTTP通过一个三位正整数,指明对请求的处理。常见的有404、400等。详见:http://zh.wikipedia.org/wiki/HTTP%E7%8A%B6%E6%80%81%E7%A0%81

  

  4、Android的HTTP API

  当你希望你的app连接到Internet时,你都需要在Manifest.xml中包含android.permission.INTERNET权限。

  4.1 Apache HTTP客户端类

  适合于Web浏览器,并且功能丰富。

  包括DefaultHttpClient和AndroidHttpClient,二者主要有以下几点区别:首先,AndroidHttpClient是在2.2版本才引入的;其次,AndroidHttpClient容许SSL管理,有简单的方法来指定UserAgent;再次,他们的连接超时和套接字超时的默认值不同;最后,他们生成实例的方式不同,DefaultHttpClient client = new DefaultHttpClient();    AndroidHttpClient client = AndroidHttpClient.newInstance(null);

  用DefaultHttpClient实现GET和POST:

  4.1.1GET请求时你只要指定URL 

    HttpClient client = new DefaultHttpClient();
    String getURL = "http://www.google.com/getrequest";
    HttpGet get = new HttpGet(getURL);
    try {
      HttpResponse responseGet = client.execute(get);
    } catch (IOException e) {
      e.printStackTrace();
    }

  4.1.2POST请求将数据作为请求的有效载荷的一部分

  

    HttpClient client = new DefaultHttpClient();
    String postURL = "http://www.google.com";
    HttpPost post = new HttpPost(postURL);
    List<NameValuePair> params = new ArrayList<NameValuePair>();
    params.add(new BasicNameValuePair("key1","value1"));
    try {
      UrlEncodedFormEntity ent = new UrlEncodedFormEntity(params, HTTP.UTF_8);
      post.setEntity(ent);
      HttpResponse responsePOST = client.execute(post);
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    } catch (ClientProtocolException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }

 

   除非服务器响应,否则execute调用不会返回,即引起阻塞。所以,应其他线程中运行HTTP操作;

  4.2 HttpURLConnection类

  HttpURLConnection是适合在2.2版本之后版本使用的轻量级客户端。

  用HttpURLConnection实现GET:

    URL url = null;
    HttpURLConnection urlConnection = null;
    try {
      url = new URL("http://www.google.com");
      urlConnection = (HttpURLConnection)url.openConnection();      //建立连接
      int statusCode = urlConnection.getResponseCode();
      InputStream in = new BufferedInputStream(urlConnection.getInputStream());
    } catch (MalformedURLException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }finally {
      urlConnection.disconnect();
    }

简介HTTP协议及及应用