小编ian*_*ell的帖子

HttpClient和非ASCII URL字符(á,é,í,ó,ú)

"长时间读者,第一次发布海报".

我正在为我管理的西班牙语Wiki 制作机器人.我想从头开始,因为我的目的之一是练习Java.但是,在尝试使用HttpClient向包含非ASCII字符(如á,é,í,ó或ú)的URI进行GET请求时遇到了一些麻烦.

String url = "http://es.metroid.wikia.com/api.php?action=query&list=categorymembers&cmtitle=Categoría:Mejoras de las Botas"
method = new GetMethod(url);
client.executeMethod(method);
Run Code Online (Sandbox Code Playgroud)

当我执行上述操作时,GetMethod会抱怨URI:

Exception in thread "main" java.lang.IllegalArgumentException: Invalid uri 'http://es.pruebaloca.wikia.com/api.php?action=query&list=categorymembers&cmtitle=Categoría:Mejoras%20de%20las%20Botas&cmlimit=500&format=xml': Invalid query
    at org.apache.commons.httpclient.HttpMethodBase.<init>(HttpMethodBase.java:222)
    at org.apache.commons.httpclient.methods.GetMethod.<init>(GetMethod.java:89)
    at net.metroidover.categorybot.http.HttpRequest.request(HttpRequest.java:69)
    at net.metroidover.categorybot.http.HttpRequest.request(HttpRequest.java:120)
    at net.metroidover.categorybot.http.Action.getCategoryMembers(Action.java:38)
    at net.metroidover.categorybot.bot.BotComponent.<init>(BotComponent.java:58)
    at net.metroidover.categorybot.bot.BotComponent.main(BotComponent.java:80)
Run Code Online (Sandbox Code Playgroud)

请注意,在堆栈跟踪中显示的URI中,空格被编码为%20,并且ís保持原样.完全相同的URI在浏览器上完美运行,但我无法接受GetMethod接受它.

我也尝试过以下方法:

URI uri = new URI(url, false);
method = new GetMethod(uri.getEscapedURI());
client.executeMethod(method);
Run Code Online (Sandbox Code Playgroud)

这样,URI逃过了is,但双重逃过了空间(%2520)......

http://es.metroid.wikia.com/api.php?action=query&list=categorymembers&cmtitle=Categor%C3%ADa:Mejoras%2520de%2520las%2520Botas&cmlimit=500&format=xml
Run Code Online (Sandbox Code Playgroud)

现在,如果我在查询中不使用任何空格,则没有双重转义,我得到所需的输出.因此,如果没有任何非ASCII字符的可能性,我不需要使用URI该类,也不会获得双重转义.为了避免第一次逃离空间,我尝试了这个:

URI uri = new URI(url, true);
method = new GetMethod(uri.getEscapedURI()); …
Run Code Online (Sandbox Code Playgroud)

java url uri httpclient mediawiki-api

4
推荐指数
2
解决办法
9809
查看次数

标签 统计

httpclient ×1

java ×1

mediawiki-api ×1

uri ×1

url ×1