我有一个已经用gawk编写的程序,可以从互联网上下载大量的小信息。 (媒体扫描仪和索引器)
目前它启动wget以获取信息。这很好,但我想简单地重用调用之间的连接。它可能运行程序可能会对相同的api服务进行200-2000次调用。
我刚刚发现gawk可以建立联网并找到geturl 然而,该页面底部的建议得到了很好的注意,我找不到一种简单的方法来读取最后一行并保持连接打开。
由于我主要阅读JSON数据,我可以设置RS =“}”并在体长达到预期的内容长度时退出。这可能会破坏任何尾随的空白区域。我想要一个更强大的方法。有没有人有更好的方法在awk中实现零星的http请求,以保持连接打开。目前我有以下结构...
con="/inet/tcp/0/host/80";
send_http_request(con);
RS="\r\n";
read_headers();
# now read the body - but do not close the connection...
RS="}"; # for JSON
while ( con |& getline bytes ) {
body = body bytes RS;
if (length(body) >= content_length) break;
print length(body);
}
# Do not close con here - keep open
遗憾的是,这一件小事似乎在破坏这里的所有潜力。如果有人问:) ..
答案 0 :(得分:2)
连接重用的问题来自HTTP 1.0标准,而不是gawk。要重复使用该连接,您必须use HTTP 1.1 or try some other non-standard solutions for HTTP 1.0。不要忘记在HTTP / 1.1请求中添加Host:
标头,因为它是必需的。
在阅读回复正文时,你是否正确缺乏稳健性。对于面向行的协议,这不是问题。此外,即使使用HTTP 1.1,如果脚本在不应该等待更多数据时锁定,服务器也会因为不活动而再次关闭连接。
作为最后的手段,你可以在你喜欢的任何语言中编写自己的HTTP检索器,它重用连接(都是我假设的同一个远程主机),并为你插入一个特殊的记录分隔符。然后,您可以控制它from the awk script。