[英]In C, how do you use libcurl to read a HTTP response into a string?
I have homework where I need somehow to compare two HTTP responses. 我有作业,需要以某种方式比较两个HTTP响应。 I am writing it on C and I use libcurl to make things easier.
我在C上编写它,并使用libcurl使事情变得更容易。 I am calling the function that uses libcurl to do a HTTP request and response from another function, and I want to return the HTTP response as a
char *
. 我正在调用使用libcurl的函数来执行HTTP请求和另一个函数的响应,我想将HTTP响应作为
char *
。 Here is my code so far (it crashes): 到目前为止,这是我的代码(崩溃):
#include <stdio.h>
#include <curl/curl.h>
#include <string.h>
size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream) {
size_t written;
written = fwrite(ptr, size, nmemb, stream);
return written;
}
char *handle_url(void) {
CURL *curl;
char *fp;
CURLcode res;
char *url = "http://www.yahoo.com";
curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
res = curl_easy_perform(curl);
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
curl_easy_cleanup(curl);
//printf("\n%s", fp);
}
return fp;
}
This solution C libcurl get output into a string works, but not in my case because I just want to return the string to the calling function. 此解决方案C libcurl将输出输出到字符串中有效,但是在我的情况下却不行,因为我只想将字符串返回给调用函数。
Any ideas? 有任何想法吗?
Fixed it for you. 已为您修复。 You need to handle the case where the
write_data()
function is called multiple times, and pass it the right kind of parameter. 您需要处理多次调用
write_data()
函数的情况,并将正确的参数传递给它。 You also need to keep track of how big a structure you've got, so you can allocate enough memory. 您还需要跟踪结构的大小,以便分配足够的内存。
I left in a debug printf
in the write_data
function to help you understand how it works. 我在
write_data
函数中留有一个调试printf
,以帮助您了解其工作原理。
#include <stdio.h>
#include <curl/curl.h>
#include <string.h>
#include <stdlib.h>
struct url_data {
size_t size;
char* data;
};
size_t write_data(void *ptr, size_t size, size_t nmemb, struct url_data *data) {
size_t index = data->size;
size_t n = (size * nmemb);
char* tmp;
data->size += (size * nmemb);
#ifdef DEBUG
fprintf(stderr, "data at %p size=%ld nmemb=%ld\n", ptr, size, nmemb);
#endif
tmp = realloc(data->data, data->size + 1); /* +1 for '\0' */
if(tmp) {
data->data = tmp;
} else {
if(data->data) {
free(data->data);
}
fprintf(stderr, "Failed to allocate memory.\n");
return 0;
}
memcpy((data->data + index), ptr, n);
data->data[data->size] = '\0';
return size * nmemb;
}
char *handle_url(char* url) {
CURL *curl;
struct url_data data;
data.size = 0;
data.data = malloc(4096); /* reasonable size initial buffer */
if(NULL == data.data) {
fprintf(stderr, "Failed to allocate memory.\n");
return NULL;
}
data.data[0] = '\0';
CURLcode res;
curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data);
res = curl_easy_perform(curl);
if(res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
}
curl_easy_cleanup(curl);
}
return data.data;
}
int main(int argc, char* argv[]) {
char* data;
if(argc < 2) {
fprintf(stderr, "Must provide URL to fetch.\n");
return 1;
}
data = handle_url(argv[1]);
if(data) {
printf("%s\n", data);
free(data);
}
return 0;
}
Note: compile with gcc -o test test.c -lcurl
(assuming you pasted into test.c
). 注意:使用
gcc -o test test.c -lcurl
编译(假设您已粘贴到test.c
)。 Use gcc -o test test.c -lcurl -DDEBUG
to see the test printf()
calls. 使用
gcc -o test test.c -lcurl -DDEBUG
查看测试printf()
调用。
Disclaimer: this is ugly, quick-and-dirty code. 免责声明:这是丑陋的,肮脏的代码。 There may be bugs.
可能有错误。 Please see the more robust, better commented example here .
请在此处查看更强大,评论更好的示例 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.