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(英雄联盟)的程序。WinSock2 HTTP GET使用方法
我的代码应该可以正常工作,我尝试从我的朋友服务器获取网页并且它工作,但它是索引。 (我用 “GET HTTP/1.0 \ r \ n”)
如果我想获得此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()只是坐在那里。
我也试过这样:
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);
是的,我确实在最后修复\ r \ n \ r \ n ...然后代码下面有两个问题。第二部分是什么意思? – user2699298
让我们假设一个Web服务器托管几个不同的域,如果您的GET请求要求在/的默认页面,然后Web服务器知道您指的是哪个域的唯一方法是通过主机头。即使它是HTTP/1.1标头,许多服务器仍然需要它。 recv阻塞指示服务器等待您完成请求... – mark
但是他们会在API信息中指定它们,对吗?我在第一篇文章中添加了API文档的图像。 – user2699298