【发布时间】:2021-08-27 05:23:37
【问题描述】:
我正在尝试使用套接字编程在 C++ 中发送一个发布请求,但该请求似乎没有被执行。我不确定 POST 请求的语法是否正确。 这是我发送的请求
string payload = "";
for (int i = 0; i < data.size(); i++)
{
payload += (data[i].first + "=" + data[i].second);
if(i<(data.size()-1))
payload += "&";
}
string request_string = "POST ";
request_string += path;
request_string += " HTTP/1.1\r\n";
request_string += ("Host: " + base_url + "\r\n");
request_string += ("Accept: */*\r\n");
request_string += ("Content-type:application/x-www-form-urlencoded\r\n");
request_string += ("Content-Length: " + to_string(payload.length()));
request_string += "\r\n";
request_string += payload;
这里base_url=httpbin.org和路径=\post和数据是一对("ef","gh")
在控制台上打印时变成了
POST /post HTTP/1.1
Host: httpbin.org
Accept: */*
Content-type: application/x-www-form-urlencoded
Content-Length: 5
ef=gh
整个代码是
string request::post(string url,vector<pair<string,string>> data){
char buffer[10000];
int data_len;
string response;
int result;
string base_url = "";
string path = "";
bool flag = true;
for (int i = 0; i < url.length(); i++)
{
if (url[i] == '/')
flag = false;
if (flag)
base_url += url[i];
else
path += url[i];
}
string payload = "";
for (int i = 0; i < data.size(); i++)
{
payload += (data[i].first + "=" + data[i].second);
if(i<(data.size()-1))
payload += "&";
}
string request_string = "POST ";
request_string += path;
request_string += " HTTP/1.1\r\n";
request_string += ("Host: " + base_url + "\r\n");
request_string += ("Accept: */*\r\n");
request_string += ("Content-type:application/x-www-form-urlencoded\r\n");
request_string += ("Content-Length: " + to_string(payload.length()));
request_string += "\r\n\r\n";
request_string += payload;
cout << request_string << endl;
struct hostent *host = gethostbyname(base_url.c_str());
SOCKADDR_IN server;
server.sin_port = htons(80);
server.sin_family = host->h_addrtype;
server.sin_addr.s_addr = *((unsigned long *)host->h_addr);
memset(&server.sin_zero, 0, 8);
SOCKET sock;
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
logger("Unable to create a socket", "Successfully created a socket", result);
result = connect(sock, (SOCKADDR *)(&server), sizeof(server));
logger("Unable to connect to the server", "Successfully connected to the server", result, sock);
result = send(sock, request_string.c_str(), strlen(request_string.c_str()), 0);
logger("Unable to send the request", "Successfully sent the request", result, sock);
while ((data_len = recv(sock, buffer, 10000, 0)) > 0)
{
int i = 0;
while (buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r')
{
response += buffer[i];
i += 1;
}
}
cout << endl
<< "***********************" << endl;
cout << "Response" << endl;
cout << "***********************" << endl;
return response;
}
网址是httpbin.org/post。
请大家指出我犯的错误
【问题讨论】:
-
您的
Content-Length缺少尾随\r\n。而且您根本不应该在payload之后附加\r\n\r\n。请求的其余部分看起来很好,所以如果您在进行这些更正后仍然遇到问题,那么您连接服务器和发送request_string的方式可能有问题,但您没有显示该代码。 -
@RemyLebeau 我做了你提到的更改,但它似乎仍然无法正常工作。我已经更新了我的问题中的代码。
标签: c++ sockets networking