一般http协议的请求包含请求行、请求头和请求正文。其中请求行就包含了请求方法,如下所示。
下面我们主要介绍 红色框的内容(请求方法)、绿色下划线(资源路径)
目录
请求方法其实就是在告诉服务端,我们有什么需求。
比如
HEAD方法,其实就是在告诉服务端,我们希望获得报文的首部;
POST方法,表示我们要上传资源/数据
GET方法,表示我们要获取资源
注意:关于Delete、Put方法,这里不作介绍,因为一般而言,Delete方法表示删除服务端的资源,而Put表示修改服务端的资源,对于这种修改资源的方法,一般不会对客户端开放,所以我们主要了解Get和Post请求即可。
现在服务器知道你的需求了,
- 假设你使用的是GET方法,你希望获取资源,那必须要让服务器知道,你所要获取的资源路径。
- 假设你使用的是POST方法,你要传递资源,那就需要告诉服务器,你要把资源放到哪
注意:这里的资源路径 '/' 不是Linux的根目录,这里的 '/' 代表网络资源的根目录webroot。路径必须访问到某一具体资源,如果请求的资源路径是 '/',说明请求的是该网站的首页信息,每个网站都必须要有一个首页index.html;如果请求的资源路径是 '/image/xxx.png',服务器返回的是image文件夹下的图片。
下面要使用表单来验证 Get 请求 和 Post请求 的差异,所以我们需要先设置一个首页,首页会包含一个简单的表单,当我们使用浏览器发送请求时,服务器返回首页。
在说资源路径的时候提到,当我们在浏览器里输入输入ip地址和端口号(192.168.xx.xx:8082),此时的资源路径就是 '/',由于路径必须访问到某一具体资源,此时服务器应该返回的是首页信息。
- html>
- <html>
- <head>
- <meta charset="utf-8">
- head>
- <body>
-
-
- <form action="/a/b/c" method="get">
- 姓名:<input type="text" name="username"/><br><br>
- 密码:<input type="password" name="passwd"/><br><br>
- <input type="submit" value="提交">
- form>
- body>
- html>
等会我们会通过浏览器来给服务器发送请求,此时服务器要做出响应,返回首页信息。下面只贴出核心代码。
- //服务端接收浏览器发来的请求
- ssize_t s = recv(sock, buffer, sizeof(buffer), 0);
- if (s > 0)
- {
- buffer[s] = 0;
- std::cout << buffer;
-
- /***************************请求行、请求头部分****************************/
- std::string http_response = "http/1.0 200 OK\n";
- http_response += "Content-Type:text/html;charset=utf-8\n"; //说明响应正文是一个html文件
- http_response += "Content-Length:"; //描述响应正文的大小
-
- struct stat st;
- stat("./webroot/index.html", &st); //使用stat函数来获取指定路径下文件的大小
- http_response += std::to_string(st.st_size);
- http_response += "\n"; // Content-Length:xxx 所在行的 ‘\n’
- http_response += "\n"; //空行
-
- /***************************请求正文部分****************************/
- std::ifstream in("./webroot/index.html");
- if (!in.is_open())
- {
- std::cerr << "文件打开失败" << std::endl;
- }
- else
- {
- std::string content;
- std::string line;
- while (std::getline(in,line)) //按行读取文件内容
- {
- content += line; //将读取到的文件内容拼接到content中
- }
- http_response += content;
- }
-
- send(sock,http_response.c_str(),http_response.size(),0); //发送响应
- }
请求行的相关知识可以参考这篇博文。
运行服务端,现在我们要通过浏览器给服务端发送请求。在地址栏内输入ip地址和端口号,然后我们就可以看到服务端返回的首页。
设置表单的请求方式为Get方法。
我们在表单里输入一些信息,点击提交。此时服务端可以接收到表单提交的请求。Get方法提交的数据在URL中,不会出现在请求正文里,同时我们在浏览器的网址也可以看到我们提交的参数。GET方法通过 URL来提交参数。
设置表单的请求方式为Post方法。
同样在表单里输入信息,点击提交,此时可以在服务端看到提交的请求。Post方法提交的参数会放在请求正文里,不会出现在URL中,浏览器的网址栏不会看到我们输入的数据,只有表单提交的路径。Post方法是通过请求正文来提交参数的。
Get方法:获取资源最常用的方式,也可以提交参数。参数放在URL中,随URL一起提交给服务端。(Get方法的参数不私密,能在URL中看到)
Post方法:提交参数最常用的方式。参数放在请求正文中,如果我们要解析正文内容,可以通过Content-Length属性获取正文内容大小,进而准确读取正文内容。(Post方法的参数是私密的,但是私密≠安全)
Get方法:Get方法也可以提交参数,但是并非无限制,由于Get方法是通过URL传递参数的,不同的浏览器会限制URL的长度,因此,Get方法提交的参数大小是有限制的。
Post方法:Post方法因为将 要提交的参数放在请求正文里,请求正文不会限制大小,因此,Post方法提交的参数大小没有限制。
Get方法:Get方法一般用于获取资源。如果要提交参数,参数所占字节数较小的时候,而且参数可见的情况下,无太大影响,可以使用Get方法上传参数
Post方法:Post方法一般用于向服务器上传资源。