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;
}
저는 Riot Games API (League of Legends)를 사용하는 프로그램을 작성하려고했습니다.WinSock2 HTTP GET 사용
내 코드가 잘 작동해야하며 내 친구 서버에서 웹 페이지를 가져 와서 작동했지만 색인이 필요했습니다. (I는 "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을 반환하면 버퍼를 출력합니다 (내 공동 작업에서는이 작업을 수행하지 않습니다.) 드하지만, 난 그냥 작동하는지 확인 255 바이트를 받았다)
문제는 그냥 recv() 함수 (블록?)에 앉아있다. 내 GET 요청에 문제가 있습니까?
가 여기에 API 정보 페이지의 : 내 요청의 헤더하지만 같은 일을 사용하려고 않았다 http://i.imgur.com/yXr5BYx.png
, RECV()는 단지 거기에 앉아있다.
나는 또한이 시도했습니다
이 불과 3 개 무작위 jibberish의 문자를 반환하는 동안 :
char buffer [2048];
recv(cSock, buffer, 2047, 0);
printf("Output string: %s\n", buffer);
이 코드는 완전히 페이지 (모든 2048 바이트 그래도 가득)을 반환합니다.
std::string output = "";
char buffer [128];
//int bytesrecv = 0;
while (recv(cSock, buffer, 127, 0) > 0)
{
output += buffer;
}
printf("Output string: %s\n", output);
예, 끝 부분에 \ r \ n \ r \ n을 수정했습니다 ... 그런 다음 코드 아래에 2 가지 문제가 있습니다. 두 번째 부분은 무엇을 의미합니까? – user2699298
웹 서버가 여러 도메인을 호스팅하고 있다고 가정 해 봅시다. GET 요청에서 기본 페이지를 요청하면 웹 서버는 Host 헤더를 통해 어떤 도메인을 참조하는지 알 수 있습니다. HTTP/1.1 헤더 일지라도 많은 서버가 필요합니다. recv 차단은 서버가 요청을 완료 할 때까지 기다리는 것을 나타냅니다 ... – mark
하지만 API 정보에서 그렇게 지정하지 않습니까? 첫 번째 게시물에 API 설명서의 이미지를 추가했습니다. – user2699298