【发布时间】:2021-01-21 05:17:57
【问题描述】:
我在向我的域发送 GET 时遇到问题。使用 80 端口,我收到 301 永久移动,使用 443 端口,我收到 400 错误请求。当我关闭重定向到 https 时,一切正常。
std::string HttpGet(std::string szHost, std::string szApi) {
std::string request;
std::string response;
int resp_leng;
char buffer[1024];
struct sockaddr_in serveraddr;
int sock;
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) L::Print(XorStr("web_parser: WSAStartup() failed"));
struct hostent* host;
host = gethostbyname(szHost.c_str());
int port = 80;
request += "GET " + szApi + " HTTP/1.0\r\n";
request += "Host: " + szHost + "\r\n";
request += "User-Agent: WebParser [Build: 1.1] \r\n";
request += "\r\n";
if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) L::Print(XorStr("web_parser: socket() failed"));
memset(&serveraddr, 0, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = *((unsigned long*)host->h_addr);
serveraddr.sin_port = htons((unsigned short)port);
struct in_addr** addr_list;
addr_list = (struct in_addr**)host->h_addr_list;
response = "";
if (connect(sock, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0) L::Print(XorStr("web_зarser: connect() failed"));
if (send(sock, request.c_str(), request.length(), 0) != request.length()) L::Print(XorStr("web_parser: send() sent a different number of bytes than expected"));
resp_leng = 1024;
while (resp_leng > 0) {
resp_leng = recv(sock, (char*)&buffer, 1024, 0);
if (resp_leng > 0) response += std::string(buffer).substr(0, resp_leng);
}
closesocket(sock);
WSACleanup();
const char* buf = response.c_str(); // Get HTTP response from URL
const char* content = strstr(buf, "\r\n\r\n");
if (content != NULL) {
content += 4; // Offset by 4 bytes to start of content
}
else {
content = buf; // Didn't find end of header, write out everything
}
return content;
}
谢谢。
【问题讨论】:
-
301 是预期的,因为您已明确添加了从 HTTP 到 HTTPS 的重定向。 400 也是预期的,因为您在需要 HTTPS 时尝试发送纯 HTTP 请求。请注意,HTTPS 不仅仅是一个不同的端口,它是一个不同的协议:HTTP over TLS。
-
除非这是一种学习体验,否则请考虑使用 HTTP 库,例如 cURL,甚至只是 WinHttp。