您好我试图创建一个Twitter控制台应用程序时遇到问题。得到答复时,我有一些骚扰。 我的代码是:
char new_request[1024] = "GET /1.1/statuses/user_timeline.json?count=4&screen_name=twitterapi HTTP/1.1\r\nHost: api.twitter.com\r\nUser-Agent: twitter-terminal-app$
strcat(new_request, bearer);
strcat(new_request, "\r\nAccept-Encoding: gzip\r\n\r\n\0");
BIO_write(bio, new_request, strlen(new_request));
printf("%s\n", new_request);
p = BIO_read(bio, ans, 2047); // Getting header
ans[p] = 0;
printf("%s\n", ans);
char ans2[100000] = "";
p = BIO_read(bio, ans2, 10000); // Getting body
BIO_should_retry(bio);
FILE *file = fopen("result.txt", "w+");
fputs(ans2, file);
printf("%s\n%i\n", ans2, p);
我身体的答案看起来像那样:
▒▒is▒HǿJ▒_ ▒▒▒▒V▒▒▒▒.▒▒T▒▒f ▒Tm▒m ▒P▒▒1▒|▒}▒%▒▒▒▒Q^▒▒▒▒▒cx{Չ? F%▒C*;▒▒ŴD/#▒L▒▒▒▒L▒A▒▒▒N▒▒ĝ▒▒▒▒$▒El▒▒▒▒X▒▒B0▒〜%▒▒5▒ ˲@ Y)GY▒ctz▒h&安培;-▒▒▒O>AG▒▒▒l6b▒z▒:K ▒T▒\▒▒2+▒b▒H▒&B▒▒▒B▒qV▒▒▒▒▒▒ ▒▒a_▒l▒?#▒o▒▒▒W▒▒u%▒▒▒;▒1M▒v▒▒L▒▒
也许答案是以某种方式编码的,这就是问题所在。试过serf dev.twitter.com但没找到任何答案。如果我使用BIO_gets()而不是BIO_read(),答案是-2。有什么想法吗?
答案 0 :(得分:3)
strcat(new_request, "\r\nAccept-Encoding: gzip\r\n\r\n\0"); ... p = BIO_read(bio, ans, 2047); // Getting header ... p = BIO_read(bio, ans2, 10000); // Getting body
......也许答案是以某种方式编码的
您已在HTTP请求中声明您支持使用gzip压缩的数据,以及服务器向您发送压缩数据的原因。如果您不仅要阅读并忽略HTTP响应标题,而且实际上看一下它,您可能会注意到:
Content-Encoding: gzip
除了明确允许压缩数据外,您还在执行HTTP / 1.1请求。这意味着您还需要能够处理chunked transfer encoding。 HTTP / 1.1还暗示默认情况下连接是持久的,因此您需要正确解析标头以找出响应真正结束的位置,而不是依赖于连接端。您也不能依赖标题的固定大小,或者可以使用单独的BIO_read调用读取标题和正文。例如,您可能需要对正文进行多次读取,否则正文可能已包含在您对标题执行的单次读取中。
除非您真的想自己处理所有这些问题,否则我建议您最好使用现有的库来正确实现这一点,从而可靠而不是偶然地获得正确的响应。
如果您想要了解如何完成此操作,我建议您首先了解有关HTTP的更多信息,即阅读wikipedia entry,然后继续使用此处引用的所有标准。我建议从HTTP / 1.0开始,因为这比HTTP / 1.1简单。