2013-12-16 5 views
3
int RiotAPI::getSite(std::string hostname) //RiotAPI is my class, almost empty atm 
{ 

if (wsa) //wsa is true, dont mind this. 
{ 
    ZeroMemory(&hints, sizeof(hints)); 
    hints.ai_family = AF_UNSPEC; 
    hints.ai_protocol = IPPROTO_TCP; 
    hints.ai_socktype = SOCK_STREAM; 

    errcode = getaddrinfo(hostname.c_str(), HTTPPORT, &hints, &result); //HTTPPORT defined as "80" <- string 
    if (errcode != 0) 
    { 
     printf("getaddrinfo() failed error: %d\n", errcode); 
    } 
    else 
     printf("getaddrinfo success\n"); 

    /*for (ptr=result; ptr != NULL; ptr->ai_next) 
    { 
     cSock = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol); 
     if (cSock == INVALID_SOCKET) 
     { 
      printf("Socket creating failed.\n"); 
     } 
    }*/ 

    cSock = socket(result->ai_family, result->ai_socktype, result->ai_protocol); //didnt bother looping through results because the web address only returns 1 IP 

    errcode = connect(cSock, result->ai_addr, (int)result->ai_addrlen); 
    if (errcode != 0) 
     printf("Could not connect to the server"); 
    else{ 
    char request [] = "GET /api/lol/na/v1.1/summoner/by-name/RiotSchmick?api_key=<MY_API_KEY> HTTP/1.0\r\n"; 
    send(cSock, request, (int)strlen(request), 0); 

    char output [256]; 
    int bytesrecv = 0; 
    //char * cmp = "{\"id\":585897,\"name\":\"RiotSchmick\",\"profileIconId\":583,\"summonerLevel\":30,\"revisionDate\":1387143444000,\"revisionDateStr\":\"12/15/2013 09:37 PM UTC\"}"; 
    bytesrecv = recv(cSock, output, 255, 0); 
    printf("Bytes read: %d\n", bytesrecv); 
    printf("Output string: %s\n", output); 
    } 
} 
    return 0; 
} 

Я пытался кодировать программу, использующую API игр Riot (League of Legends).WinSock2 HTTP GET use

Мой код должен работать нормально, я пытался получить веб-страницу с сервера моих друзей, и это сработало, но это был индекс. (Я использовал "GET HTTP/1.0 \ г \ п")

Если я хочу, чтобы получить содержимое этого URL:

http://prod.api.pvp.net/api/lol/na/v1.1/summoner/by-name/RiotSchmick?api_key=<here_goes_my_api_key> 

не Должен ли я продолжить так:

1) Подключиться к htt: //prod.api.pvp.net

2) Отправить "GET /api/lol/na/v1.1/summoner/by-name/RiotSchmick?api_key= HTTP/1.0 \ r \ n "

3) recv() до возврата 0, затем распечатайте буфер (я не делаю этого в своем c ode, хотя я просто попытался получить 255 байт, чтобы увидеть, если это сработало)

Проблема в том, что она просто находится на функции recv() (блоки?). Что-то не так с моим запросом GET?

Вот страница информации API: http://i.imgur.com/yXr5BYx.png

Я пытаюсь использовать заголовки в моей просьбе, но то же самое, RECV() просто сидит там.

Я также попытался это:

char buffer [2048]; 
recv(cSock, buffer, 2047, 0); 
printf("Output string: %s\n", buffer); 

Этот код возвращает страницу полностью (не все 2048 байт заполнены, хотя):

В то время как это просто возвращает 3 случайных символов jibberish.

std::string output = ""; 
char buffer [128]; 
//int bytesrecv = 0; 

while (recv(cSock, buffer, 127, 0) > 0) 
{ 
    output += buffer; 
} 
printf("Output string: %s\n", output); 

ответ

1

Ваш запрос GET не является полным, минимально он должен заканчиваться пустой строкой ... т.е. \r\n\r\n в конце. Но вы, вероятно, столкнетесь с другими проблемами, например, с требованием заголовка Host, если сервер обслуживает несколько доменов ...

+0

Да, я исправил \ r \ n \ r \ n в конце ... тогда У меня эти 2 проблемы ниже кода. Что вы подразумеваете под второй частью? – user2699298

+0

Предположим, что на веб-сервере размещено несколько разных доменов, если ваш запрос GET запрашивает страницу по умолчанию в/то единственный способ, которым веб-сервер знает, к какому домену вы обращаетесь, является через заголовок Host. Для многих серверов это требуется, хотя это заголовок HTTP/1.1. Блокировка recv указывает на сервер, ожидающий завершения запроса ... – mark

+0

Но они будут указывать, что в информации API, не так ли? В первом сообщении я добавил изображение документации API. – user2699298