用C ++获取页面内容

时间:2011-08-23 23:59:40

标签: c++

我已经创建了一个PHP和C#应用程序,可以从他们的玩家代号中获取用户Xbox 360个人资料ID。

我只是想知道我是如何处理Web请求并将网址的内容放入C ++中的字符串中。

感谢。

1 个答案:

答案 0 :(得分:2)

这是我在一段时间后使用libCURL编写的一个蹩脚的C ++ HTTP提取程序。

它接受一个URL并返回一个包含get请求内容的字符串。修改味道:

/*
 *  HttpFetcher.h
 */
#ifndef _http_fetcher_
#define _http_fetcher_

#include <stdlib.h>
#include <string>

class HttpFetcher {
public:
  std::string simpleGetRequest(std::string url);

private:
  // Private methods to handle getting 
  struct MemoryStruct {
    char *memory;
    size_t size;
  };
  static size_t WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data);

};

#endif // ifndef _http_fetcher_

/*
 *  HttpFetcher.cpp
 *  Much of this is quite similar to examples on the libcURL site
 */

#include "HttpFetcher.h"
#include "curl.h"
#include "easy.h"
#include <iostream>


size_t HttpFetcher::WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data)
{
  size_t realsize = size * nmemb;
  struct MemoryStruct *mem = (struct MemoryStruct *)data;

  mem->memory = (char*)realloc(mem->memory, mem->size + realsize + 1);
  if (mem->memory == NULL) {
    /* out of memory! */ 
    printf("not enough memory (realloc returned NULL)\n");
    exit(EXIT_FAILURE);
  }

  memcpy(&(mem->memory[mem->size]), ptr, realsize);
  mem->size += realsize;
  mem->memory[mem->size] = 0;

  return realsize;
}



std::string HttpFetcher::simpleGetRequest(std::string url)
{
  std::string toReturn = "";
  CURL *curl = NULL;

  struct MemoryStruct chunk;
  chunk.memory = (char*)malloc(1);
  chunk.size = 0;

  CURLcode res;
  curl = curl_easy_init();
  if(curl) {
    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &WriteMemoryCallback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&chunk);
    // Some requests fail without a user agent.
    curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0");

    res = curl_easy_perform(curl);

    curl_easy_cleanup(curl);

    toReturn = std::string(chunk.memory);
  }

  free(chunk.memory);

  return toReturn;
}