我正在尝试将数据发送到在localhost上运行的Apache。数据以json格式正确形成,但是当我使用libcurl发送数据时,我在PHP网络服务器上使用
回显字符串echo file_get_contents("php://input");
它返回随机字符,这是服务器回显的数据
`é ²²²²▌▌▌▌4Ég\▌ îHGáF
在C ++中,当我回显json时,它会正确打印。
Request.C ++
void Request::execute() {
auto curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, mUrl);
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
curl_easy_setopt(curl, CURLOPT_USERAGENT, "RoBot/ Version 1");
curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 50L);
curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &mResponse);
curl_easy_setopt(curl, CURLOPT_HEADERDATA, &mHeaders);
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &mResponseCode);
if (!mData.empty()) {
curl_easy_setopt(curl, CURLOPT_POST, true);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, mData);
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, mData.size());
}
if (mHeadersData) {
curl_easy_setopt(curl, CURLOPT_HEADER, true);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, mHeadersData);
}
curl_easy_perform(curl);
curl_easy_cleanup(curl);
curl_slist_free_all(mHeadersData);
curl = nullptr;
}
这就是我执行它的方式。
json data;
data["username"] = username;
data["password"] = password;
std::cout << data.dump() << std::endl;
Request* request = new Request("http://localhost:8080/Projects/");
request->setPostData(data.dump());
//request->addHeader("Content-Type: application/json");
request->execute();
std::cout << request->getResponse() << std::endl;
std::cout << request->getHeaders() << std::endl;
这是打印到控制台的内容
Username: id
Password: kf
{"password":"kf","username":"id"}
`é ²²²²▌▌▌▌4Ég\▌ îHGáF
HTTP/1.1 200 OK
Date: Sat, 27 Aug 2016 09:15:07 GMT
Server: Apache/2.4.6 (Win32) PHP/5.4.17
X-Powered-By: PHP/5.4.17
Content-Length: 36
Content-Type: text/html
任何想法为什么?
[EDITED]
写函数如下所示
size_t write(void *ptr, size_t size, size_t nmemb, std::string* data) {
data->append((char*)ptr, size * nmemb);
return size * nmemb;
}
我按照以下方式设置数据
void Request::setPostData(std::string data) {
mData = data;
}
[编辑2]
所以我现在知道这个问题,显然libcurl只接受char *并且我发送std :: string。因为我的json库将json对象转换为std :: string吗?
,是否存在某种解决方法答案 0 :(得分:3)
这一行错了:
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, mData);
根据libcurl文档:
将char *作为参数传递,指向要在HTTP POST操作中发送的完整数据。您必须确保数据的格式与服务器接收数据的方式相同。 libcurl不会以任何方式为您转换或编码它。例如,Web服务器可能会假设此数据是url编码的。
指向的数据不会被库复制:因此,它必须由调用应用程序保留,直到关联的传输完成。通过设置
CURLOPT_COPYPOSTFIELDS
选项可以更改此行为(因此libcurl会复制数据)。
您依赖std::string
的内部实现来开始使用指向字符数据的char*
指针,但这并不能保证。该行应该是这样的:
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, mData.c_str());
这可以保证您获得指向字符数据的char*
指针。 <{1}}被修改或销毁之前,指针将保持有效。
答案 1 :(得分:-2)