c++ - C++でページのコンテンツを取得する

c++

ユーザーのXbox 360プロファイルIDをゲーマータグから取得するPHPおよびC#アプリを作成しました。

Webリクエストを実行して、URLのページコンテンツをC++の文字列に挿入する方法を考えていたところです。

ありがとう。
答え
これは、私がしばらく前に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;
}
関連記事

c++ - アプリケーションにフォーカスがない場合のキープレスの検出

c++ - BOOST ASIO:Windowsで「bind:Address already in use」を取得しないのはなぜですか(ただし、Linuxで取得します)?

c++ - ビル印刷ジョブ

c++ - 文字列ストリームからファイルにデータを書き込む方法(CPP)

c++ - utf 8の2つの文字列の比較が正しくないのはなぜですか?

c++ - 十分に文書化されたオープンソースおよび高速C / C++画像操作ライブラリ。 「サイズ変更」のように、回転、色の変更、切り抜き[終了]

c++ - 重複するQGraphicsItem-sホバーイベント

c++ - 数値データをchar *にシリアル化する方法

c++ - コンパイラがサポートしているISO C++標準のバージョンを確認するにはどうすればよいですか? [重複]

c++ - ラッパークラスの静的初期化子リスト