据我了解,我的问题是:在 Julia 中使用下载包功能时,如何确定在发出请求时正确传递标头(“User-Agent”或“Api-User-Agent”=我的联系信息)到维基媒体网络应用程序编程接口(https://en.wiktionary.org/w/api.php?action=query)?
作为参考,起初我以为超文本事务协议请求标头进入了统一资源定位器,当我的浏览器和代码中的 Web 应用程序编程接口响应返回错误时,我感到很困惑......“无法识别的参数:用户-代理。”;}}...,感谢 Christoph Rackwitz 的回复,为我提供了很好的资源 (https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/GET)来纠正我。
弄乱我的代码之后
wikiwords = "dog|cat";
wikidata = "some\valid\path\dontworry.txt";
wikiurl = "https://en.wiktionary.org/w/api.php?action=query&prop=revisions&rvprop=content&format=json&rvslots=main&maxlag=1&titles=" * wikiwords;
wikiheaders = Dict(
"User-Agent" => "learning_julia_test(;)julia1_11",
"Testheader" => "pleasereject");
requesty = Downloads.request(wikiurl;
output=wikidata, method="GET", headers=wikiheaders);
print("\n" * string(requesty.proto) * "\n");
print(string(requesty.url) * "\n");
print(string(requesty.status) * "\n");
print(string(requesty.message) * "\n");
print(replace(string(requesty.headers), r"[\"][ ]*[,][ ]*[\"]" => "\n"));
print((read(wikidata, String)));
我找不到方法来确保我的标头被正确传递。
我试过:
不传递标头
传递我认为很好的头球
传递我认为不好的头球
传好头球和坏头球
...不幸的是,这些更改都没有改变(以有意义的方式)我认为 Julia 的下载包功能的所有可用输出(基于文档https://docs.julialang.org/en/v1/ stdlib/Downloads/#Downloads.request) 从 https://en.wiktionary.org/w/api.php?action=query.
发出请求时我的用例是一个机器人,它每 15 秒提取大约 20 个字的数据,将近 300 次,这很容易被识别为机器人。根据 https://www.mediawiki.org/wiki/Special:MyLanguage/API:Etiquette 如果我没有适当地标记我的机器人并在标头中提供联系信息,我的 IP 可能会被禁止,这可能会使我因焦虑而身体不适。
使用最新的 Windows 11、Julia1.11、最新的 VS Code 以及最新的 Julia 插件。
由于我的焦虑,我非常反对使用任何没有良好安全实践和大量资本或声誉投资的软件包、下载或网站。 (我信任 Firefox,但也许不是每个 Mozilla 项目。)
任何帮助或指示将不胜感激。
修改和重新阅读文档后,我发现另一个标头传递给维基媒体,这确实改变了输出,确认我的标头被正确接收。
wikiheaders=Dict("User-Agent"=>"learning_julia_test(;)julia1_11","Accept-Encoding"=>"gzip")# for testing
当我通过“接受编码”:“gzip”时,返回的文件采用 gzip 格式,这确认 wikimedia 正确解释了我发送的内容。
感谢@C3roe,我认为这是一种更好、更通用的方法,使用像 requestcatcher.com 这样的服务(似乎由一家名为 Omni 的公司拥有)来测试我的代码是否按预期运行,而不是依赖于预期接收者进行确认。如果每个 api get 请求可能会产生重大成本或后果,那么这会更可取。