Http学习笔记(二)

  接上节,上节总结http的一些原理,内容比较死板。这节我来总结一些常用的请求方法,配合代码可能会比较实用一些。

  1.什么是http的请求方法

  link:

    http://wenku.baidu.com/view/a8293a6c7e21af45b307a877.html

    http://baike.baidu.com/view/1628025.htm?fromId=9472#4

  book:

    《HTTP.The.Definitive.Guide》 David.Gourley

  我就不展开了,大家自行学习

  2.请求方法汇总

  • GET
  • POST
  • PUT
  • DELETE
  • HEAD
  • OPTIONS
  • TRACE
  • OTHER(扩展方法这里暂先不总结)

  我们先来看看常用的7个方法,我用几句话总结:

    PUT|POST|GET|DELETE 个人理解对应数据库的 CURD 操作,这样方便易记。HEAD返回响应报头,不返回主体BODY。OPTIONS请求服务器支持的功能。TRACE主要的应用就是调试。

  下面贴段代码:  

 1             TcpClient client = new TcpClient();
 2             client.Connect(url, 80);
 3             string requeststr = string.Empty;
 4             if (client.Connected)
 5             {
 6                 //requeststr = string.Format("{0} * HTTP/1.1\r\nHost:{1}\r\nAccept:*\r\n\r\n", "OPTIONS", url);
 7                 requeststr = string.Format("{0} {1} HTTP/1.1\r\nHost:{2}\r\nAccept:*.*\r\n\r\n", "GET", "/13/0407/10/8RRR4N8N00014JB6.html", url);
 8                 //requeststr = string.Format("{0} {1} HTTP/1.1\r\nHost:{2}\r\nContent-type: text/plain\r\nContent-length:5\r\n\r\nABCDE\r\n\r\n", "PUT","/product-list.txt", url);
 9                 try
10                 {
11                     Console.WriteLine(requeststr);
12                     client.Client.Send(Encoding.UTF8.GetBytes(requeststr));
13                     using (NetworkStream stream = client.GetStream())
14                     {
15                         using (StreamReader reading = new StreamReader(stream))
16                         {
17                             string content = null;
18                             while ((content = reading.ReadLine()) != null)
19                             {
20                                 Console.WriteLine(content);
21                                 if (string.IsNullOrEmpty(content))
22                                 {
23                                     break;
24                                 }
25                             }
26                         }
27                     }
28                 }catch(Exception ex){
29                     throw ex;
30                 }
31             }
32 
33         private const string url = @"news.163.com";
34         //private const string url = @"www.joes-hardware.com";
35         //private const string url = @"127.0.0.1";
36         private const string file = @"d:/111.txt";

  代码使用C#的TcpClient模拟http请求,并接收服务器响应。http请求报文由字符串组织,本段代码执行了HEAD、OPTIONS、PUT操作。输出结果如图1,2,3:

                      图1

GET方法和HEAD方法的不同就是GET返回BODY,上图我们可以看到news.163.com返回响应报头 200 Ok。

                    图2

通过OPTIONS方法访问本机IIs可以看到本机目前允许访问的方法。

                    图3

通过PUT方法,将ABCDE 5个字符增至服务器的product-list.txt文件中。如成功,返回响应200 Ok。(注:通过PUT方法可以覆盖一个同名文件,这为我们项目中传统的使用FTP的方式提供了另外一种解决方案,虽然它并不够好~)

从图3我们可以看到服务器返回 405 从allow里看到PUT方法是不允许的。这里引出了一个问题:即安全性的问题。

通过使用PUT、DELETE方法可以随意的更改远程服务器上的文件,这种做法显然是不安全的。所以一般公网服务器都会禁用此操作。

为了学习,大家可以在本机的IIS上开放PUT和DELETE方法。

关于PUT和DELETE方法可以引出:

1.请求方法权限设置: IIS中的映射设置(请求限制,谓词,访问)  http 405错误

2.HTTP安全机制:基本访问、匿名访问、WINDOWS身份访问等(包括本地安全策略) http 401 错误

3.WebDEV扩展:作为http扩展协议,WebDEV扩展了一些操作,如Copy、Move、Lock、Unlock,并可使用Xml定义来操作一组文件[包括层次结构]的描述。

         在IIS中启用WebDEV会限制PUT和DELETE方法的操作范围,以至通过1,2方法解决401,405错误后仍然无法响应PUT和DELETE操作。在IIS7及其以上版本中部署和配置了WCF,WebService,MVC都会改变PUT和DELETE方法和WebDEV的操作范围,可以通过web.config通过配置解决此类问题。(由于IIS6,7,7.5,8 几个版本和使用不同应用程序池对web.config的配置影响很大,将另外开篇讲述IIS的配置问题) 


下节通过使用示例WebDEV上传一批带有层次结构的文件集合来讲述WebDEV的一些用法。

参考:

  http://support.microsoft.com/kb/942051/en-us

  http://forums.iis.net/t/1166025.aspx

  http://goneale.com/2009/10/22/wcf-the-http-request-is-unauthorized-with-client-authentication-scheme-anonymous

关于WebDEV:

  目前加入组织支持该协议的公司和组织有:Apache,MS,Apple,IBM,Oracle...知道这些就够了。总之了解到不管商业级的Weblogic,WebSphere,IIS还是开源项目Tomcat,JBoss都支持就Ok了。

 

转载时,请注明本文来源:www.cnblogs.com/tmywu  

作者: 老鱼678

mail:tommywu23@126.com

    

原文地址:https://www.cnblogs.com/tmywu/p/3006458.html