鱼C论坛

 找回密码
 立即注册
123
返回列表 发新帖
楼主: 小甲鱼

[扩展阅读] 99% 的人都理解错了 HTTP 中 GET 与 POST 的区别(转)

  [复制链接]
发表于 2020-12-10 16:47:53 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-2-23 16:49:52 | 显示全部楼层
学会了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-2-27 22:36:08 | 显示全部楼层
我写了一个socket类,recv返回两次第一次200OK第二次就Bad Request了有点迷惑阿
代码:
  1. #pragma once
  2. #include"EspString.hpp"
  3. #pragma comment(lib,"ws2_32.lib")
  4. #include<iostream>
  5. class EspHttp
  6. {
  7. private:
  8.         unsigned int HSocket = INVALID_SOCKET;
  9.         bool IsPost = false;
  10.         bool IsHttps = false;
  11.         unsigned int ErrorCode;
  12.         unsigned short nPort;
  13.         EspString lpszScheme;//http or https
  14.         EspString lpszEntireURL;
  15.         EspString lpszHostName;//www.baidu.com
  16.         EspString lpszURLPath;// ...com/[.....]<-
  17.         EspString lpszProtocol;//Submitted/received protocol
  18.         EspString lpszAddInfo;//POST method
  19.         EspString lpszResult;//recv
  20.         EspString lpszStatus;//HTTP/1.1 200 OK   HTTP/1.1 400 Bad Request
  21.         EspString lpszContent;// Manbody of the Result
  22.         bool RequestOK;//Whether is HTTP/1.1 200 OK
  23.         bool AnalyzeURL()
  24.         {
  25.                 unsigned long ParsePos = 0; unsigned long TargetPos = 0;
  26.                 assert(lpszEntireURL.GetBuffer() != NULL && ::IsBadStringPtrA(lpszEntireURL.GetBuffer(), -1) == false);
  27.                 EspString lpszTempString;

  28.                 TargetPos = lpszEntireURL.Find(":", 0);
  29.                 if (TargetPos == -1)
  30.                         return false;
  31.                 lpszTempString = lpszEntireURL.GetLeftStr(TargetPos);
  32.                 if (lpszTempString.CompareNoCase("http"))
  33.                         lpszScheme = "http";
  34.                 else if (lpszTempString.CompareNoCase("https"))
  35.                 {
  36.                         lpszScheme = "https";
  37.                         IsHttps = true;
  38.                 }
  39.                 else
  40.                         return false;

  41.                 ParsePos += (lpszTempString.GetLength() + 3);
  42.                 TargetPos = lpszEntireURL.Find(":", ParsePos);
  43.                 if (TargetPos != -1)
  44.                 {
  45.                         lpszTempString = lpszEntireURL.GetMidStr(ParsePos, TargetPos - ParsePos);
  46.                         if (lpszTempString.IsEmpty())return false;
  47.                         lpszHostName = lpszTempString;
  48.                         ParsePos += (lpszTempString.GetLength() + 1);
  49.                         TargetPos = lpszEntireURL.Find("/", ParsePos);
  50.                         if (TargetPos == -1)
  51.                                 return false;
  52.                         nPort = ::strtoul(lpszEntireURL.GetMidStr(ParsePos, TargetPos - ParsePos).GetAnsiStr(), 0, 0);
  53.                 }
  54.                 else
  55.                 {
  56.                         TargetPos = lpszEntireURL.Find("/", ParsePos);
  57.                         if (TargetPos == -1)
  58.                                 return false;
  59.                         lpszTempString = lpszEntireURL.GetMidStr(ParsePos, TargetPos - ParsePos);
  60.                         if (lpszTempString.IsEmpty())return false;
  61.                         lpszHostName = lpszTempString;
  62.                         if (IsHttps)
  63.                                 nPort = 443;
  64.                         else
  65.                                 nPort = 80;
  66.                 }
  67.                 lpszURLPath = lpszEntireURL.GetMidStr(TargetPos, lpszEntireURL.GetLength() - TargetPos);
  68.                 return true;
  69.         }
  70. public:
  71.         EspHttp()
  72.         {
  73.                 WSADATA SocketData = { 0 };
  74.                 ErrorCode = ::WSAStartup(MAKEWORD(2, 2), &SocketData);
  75.                 if (ErrorCode == 0)
  76.                 {
  77.                         HSocket = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  78.                         if (HSocket == INVALID_SOCKET)
  79.                                 ErrorCode = ::WSAGetLastError();
  80.                 }
  81.         }
  82.         ~EspHttp()
  83.         {
  84.                 if (ErrorCode == 0)
  85.                 {
  86.                         if (HSocket != INVALID_SOCKET)
  87.                                 ::closesocket(HSocket);
  88.                         ::WSACleanup();
  89.                 }
  90.         }
  91.         unsigned int GetLastError() { return ErrorCode; }

  92.         bool ConnectTo(const char* lpszURL, bool IsPOST = false, const char* lpszAddInfo = NULL)
  93.         {
  94.                 assert(lpszURL != NULL && ::IsBadStringPtrA(lpszURL, -1) == false);
  95.                 lpszEntireURL = lpszURL;
  96.                 if (lpszEntireURL.IsEmpty())
  97.                         return false;
  98.                 if (!AnalyzeURL())
  99.                         return false;
  100.                 SOCKADDR_IN SocketAddr = { AF_INET,::htons(nPort),*((LPIN_ADDR) * ::gethostbyname(lpszHostName.GetAnsiStr())->h_addr_list) };
  101.                 if (::connect(HSocket, (LPSOCKADDR)&SocketAddr, sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
  102.                 {
  103.                         ErrorCode = ::WSAGetLastError();
  104.                         ::closesocket(HSocket);
  105.                         return false;
  106.                 }
  107.                 IsPost = IsPOST;
  108.                 if (IsPost)
  109.                 {
  110.                         lpszProtocol.Append("POST ");
  111.                         if (lpszAddInfo != NULL)
  112.                                 this->lpszAddInfo = lpszAddInfo;
  113.                 }
  114.                 else
  115.                         lpszProtocol.Append("GET ");
  116.                 lpszProtocol.Append(lpszURLPath.GetAnsiStr());
  117.                 lpszProtocol.Append(" HTTP/1.1\r\n");
  118.                 lpszProtocol.Append("Host: "); lpszProtocol.Append(lpszHostName.GetAnsiStr()); lpszProtocol.Append("\r\n");
  119.         }
  120.         void AddToProtocol(const char* lpszName, const char* lpszValue)
  121.         {
  122.                 assert(lpszName != NULL && ::IsBadStringPtrA(lpszName, -1) == false);
  123.                 assert(lpszValue != NULL && ::IsBadStringPtrA(lpszValue, -1) == false);
  124.                 lpszProtocol.Append(lpszName);
  125.                 lpszProtocol.Append(": ");
  126.                 lpszProtocol.Append(lpszValue);
  127.                 lpszProtocol.Append("\r\n");
  128.         }
  129.         bool SendRequest()
  130.         {
  131.                 lpszProtocol.Append("\r\n");
  132.                 if (IsPost)
  133.                         lpszProtocol.Append(lpszAddInfo);
  134.                 if (::send(HSocket, lpszProtocol.GetAnsiStr(), lpszProtocol.GetLength() + 1, 0) == SOCKET_ERROR)
  135.                 {
  136.                         ErrorCode = ::WSAGetLastError();
  137.                         return false;
  138.                 }
  139.                 char* Buffer = (char*)::malloc(1025);
  140.                 if (Buffer == NULL)
  141.                         throw("Allocate Buffer Unsuccessfully");
  142.                 unsigned long BufferSize = 0;
  143.                 lpszResult.Empty();
  144.                 do
  145.                 {
  146.                         BufferSize = ::recv(HSocket, Buffer, 1024, 0);
  147.                         if (BufferSize > 0)
  148.                         {
  149.                                 ::memset(Buffer + BufferSize, 0, (1025 - BufferSize) * sizeof(char));
  150.                                 lpszResult.Append(Buffer);
  151.                         }
  152.                         else if (BufferSize == 0)
  153.                                 break;
  154.                         else if (BufferSize == SOCKET_ERROR)
  155.                         {
  156.                                 ErrorCode = ::WSAGetLastError();
  157.                                 return false;
  158.                         }
  159.                 } while (BufferSize != 0);
  160.                 if (!lpszResult.IsEmpty())
  161.                 {
  162.                         unsigned long Pos1 = lpszResult.Find("\r\n");
  163.                         if (Pos1 == -1)return false;
  164.                         lpszStatus = lpszResult.GetLeftStr(Pos1);
  165.                         unsigned long Pos2 = lpszResult.Find("\r\n\r\n");
  166.                         if (Pos2 == -1)return false;
  167.                         lpszProtocol = lpszResult.GetMidStr(Pos1, Pos2);
  168.                         lpszContent = lpszResult.GetMidStr(Pos2+1, lpszResult.GetLength() - Pos2);
  169.                         return true;
  170.                 }
  171.                 else
  172.                         return false;
  173.         }
  174.         EspString GetResponce()
  175.         {
  176.                 return lpszContent;
  177.         }
  178. };
复制代码

前前后后很多次了就是recv这个部分的问题其他部分没啥问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-4-2 00:53:02 | 显示全部楼层
谢谢,讲解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-4-12 19:12:48 | 显示全部楼层
表示看一遍根本没看懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-5-11 00:06:12 | 显示全部楼层
哈哈哈,涨芝士了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-5-24 15:44:57 From FishC Mobile | 显示全部楼层
收下了,重点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-6-6 22:51:12 | 显示全部楼层
DylanBee 发表于 2018-11-29 02:52
小甲鱼,您好,我是一名高中生,因为小时候喜欢计算机,所以瞎学了很多没用的知识,准确说不知道怎么去学, ...

怎么样了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-6-21 11:48:11 | 显示全部楼层
总结一下,也许就一句话:
get和post本质上都是TCP链接,而get只产生一个数据包,post会产生两个数据包。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-6-21 15:56:13 | 显示全部楼层
后退,我要开始在朋友前装逼了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-10-19 15:28:13 | 显示全部楼层

沙发~
感谢楼主!
收下了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-11-17 19:14:58 From FishC Mobile | 显示全部楼层
看不懂咋办啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-1-11 17:52:00 | 显示全部楼层
细致啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-3-29 19:33:31 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1

GMT+8, 2022-5-19 17:44

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表