处理HTTP POST请求/响应

Handling HTTP POST request/response

本文关键字:响应 请求 POST HTTP 处理      更新时间:2023-10-16

我一直在尝试将HTTP POST请求发送到Facebook而没有成功的情况下,我从服务器获得此响应:

http/1.1 400不良请求内容类型:text/html;charset = UTF-8日期: 星期六,2016年12月10日21:28:17 GMT连接:关闭内容长度:2959

Facebook |错误

对不起,我们正在处理问题,我们将其修复 我们尽快

我的代码

#include <iostream>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <netdb.h>
#include <fstream>
using namespace std;
int main()
{
    int s, error;
    struct sockaddr_in addr;

        s = socket(AF_INET, SOCK_STREAM, 0);
    if(s <0)
    {
        cout<<"Error 01: creating socket failed!n";
        close(s);
        return 1;
    }
    addr.sin_family = AF_INET;
    addr.sin_port = htons(80);
    inet_aton("31.13.90.36",&addr.sin_addr);
    error = connect(s,(sockaddr*)&addr,sizeof(addr));
    if(error!=0)
    {
        cout<<"Error 02: conecting to server failed!n";
        close(s);
        return 1;
    }
     const int msgSize = 1042;
     char msg[] = "POST /login.php?login_attempt=1 rn"
                     "HTTP/1.1rn"
                     "HOST: facebook.comrnrn"
                     "Content-type: application/x-www-form-urlencodedrn"
                     "Content-Length: 41rn"
                     "email=lel@gmail.com&pass=test123&submit=1rn" ;



     char answ[1042];
    //cin.getline(&msg[0],256);
    send(s,msg,strlen(msg),0);

    ssize_t len;
    while((len = recv(s, msg, strlen(msg), 0)) > 0)
    {
        cout.write(msg, len);
        std::cout << std::flush;
    }
    if(len < 0)
    {
        cout << "error";
    }
    close(s);  
}

我做错了什么?

您的消息中有几个错误。这是您根据代码发送的内容:

1  POST /login.php?login_attempt=1 rn
2  HTTP/1.1rn 
3  HOST: facebook.comrnrn
4  Content-type: application/x-www-form-urlencodedrn
5  Content-Length: 41rn
6  email=lel@gmail.com&pass=test123&submit=1rn

相反,应该像这样:

1  POST /login.php?login_attempt=1 HTTP/1.1rn
2  HOST: facebook.comrn
3  Content-type: application/x-www-form-urlencodedrn
4  Content-Length: 41rn
5  rn
6  email=lel@gmail.com&pass=test123&submit=1

详细:

  • 第1行和第2行应该是一行,即"方法路径http-version"
  • 第3行不应包含多个rn
  • 相反,空行rn应在所有HTTP标头(新行5)之后
  • 第6行中的主体应仅包含内容长度涵盖的数据。您在此设置的41个字节不包括您发送的rn

除此之外,您无法正确解析响应,而是希望服务器完成响应后关闭连接。由于您使用的是HTTP/1.1,因此您隐式使用持久连接(HTTP Keep-Alive),因此服务器实际上可能在同一TCP连接中等待更多请求,而不会立即关闭连接。

我真的建议您研究HTTP的标准,而不是猜测协议的工作方式。