无法接收HTTP响应正文C++
Unable to receive HTTP response body C++
首先,这里是我用来发出HTTPPOST请求的C++代码。它链接到ws2_32.lib
。
int POST_TEST(std::string URL, std::string DATA)
{
//**************************************************
std::string TEXT = "";
std::string DIRECTORY = URL.substr(URL.find(".com") + std::string(".com").length());
std::string HOST = URL.substr(0, URL.find(".com", std::string(".com").length())) + ".com";
std::string REQ = "POST " + DIRECTORY + " HTTP/1.1rnContent-Length: " + to_string(DATA.length()) + "rnAccept-Language: en-US,en;q=0.5rnAccept-Encoding: gzip, deflaternHost: " + HOST + "rnAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8rnUser-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:44.0) Gecko/20100101 Firefox/44.0rnConnection: keep-alivernContent-Type: application/x-www-form-urlencodedrnrn" + DATA;
const char * REQUEST = REQ.c_str();
//**************************************************
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
return 1;
SOCKET Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
struct hostent *host = gethostbyname(HOST.c_str());
SOCKADDR_IN SockAddr;
SockAddr.sin_port = htons(80);
SockAddr.sin_family = AF_INET;
SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr);
if(connect(Socket,(SOCKADDR*)(&SockAddr), sizeof(SockAddr)) != 0)
return 1;
send(Socket, REQUEST, strlen(REQUEST), 0);
char buffer[1000];
int nDataLength;
while((nDataLength = recv(Socket, buffer, 1000, 0)) > 0)
{
int i = 0;
while(buffer[i] >= 32 || buffer[i] == 'n' || buffer[i] == 'r')
{
TEXT += buffer[i];
i++;
}
}
closesocket(Socket);
WSACleanup();
MessageBoxA(NULL, TEXT.c_str(), "HTTP Response", MB_OK);
return 0;
}
POST_TEST("blah.com/a.php", "a=blah");
代码运行良好,但我只收到HTTPHeader响应,没有看到BODY响应。使用Python向同一个php页面发出POST请求可以让我很好地看到响应主体。我不确定我是否误解了什么,或者我的代码中有错误。
我张贴到的PHP页面位于我自己的服务器上。PHP回显了一些文本,但我在响应中没有看到。这是我得到的回应:
HTTP/1.1 200 OK
Server: nginx/1.8.1
Date: Fri, 08 Apr 2016 02:10:14 GMT
Content-Type: text/html
Content-Length: 286
Connection: keep-alive
Vary: Accept-Encoding
Content-Encoding: gzip
我怎样才能看到整个回复?
显示的代码中有两个错误。
-
它不检查来自
send()
的返回值。send()
并不保证请求发送的字节数实际上已发送。来自send()
的返回值可以返回被写入的字节少于被请求的字节的指示。您有责任检查,然后再次尝试send()
剩余的字节。 -
阅读和收集回复的逻辑是错误的。
recv()
告诉您收到了多少字节。这一点被完全忽略。相反,代码扫描读取缓冲区,直到它看到一个控制字符作为一个字节。
请注意,您的HTTP响应表明您正在获取原始的、gzip压缩的二进制数据。在实际响应的前几个字节内,很可能会有一些二进制字节对应于ASCII控制字符的值。在那一点上,你的循环将戛然而止。
即使你期望得到一个纯文本的回复,这种逻辑仍然是错误的。它是recv()
的返回值,告诉您接收了多少字节,而没有其他信息。
相关文章:
- 当服务中的事件被触发时,如何将响应从服务发送回客户端?
- Azure Kinect 使用正文索引映射裁剪正文
- C++ 信号和插槽不工作:插槽不响应事件
- NodeJs 服务器充斥着 UDP 广播,不发送响应
- C++关于ENUM的问题。我得到的响应比枚举列表大
- 应用程序在打开的简历中捕获视频后没有响应
- 使用 cpprest (Casablanca) 返回 PDF 响应
- 为什么当通过 TCP 发送的消息速率增加时,请求-响应消息对的延迟会降低?
- 为什么调用没有正文的纯虚拟方法不会导致链接器错误?
- 如何使用从处理程序调度的最终回调将响应异步返回给调用方on_read?
- 获取加密的正文响应WinHttp HTTPS
- QtConcurrent - 在发布到 UI 线程的数千个结果中保持 GUI 响应
- 同步读取多个 TCP 响应
- HTTP 响应格式不正确?
- 如何使用软化工具包从 OPC UA 服务器异步读取操作回调中的数据值响应中获取 NodeId 详细信息
- HTTP帖子,无需等待响应
- 问题导致程序停止响应,并且姓氏未正确打印
- 如何从响应中只读正文
- 无法接收HTTP响应正文C++
- C++WinHttp获取响应标头和正文