这个URI URL有什么问题?IllegalArgumentException,非法字符。

4

我遇到了一个错误:

W/System.err(32720): java.lang.IllegalArgumentException: Illegal character in query at index 89: https://api.mongolab.com/api/1/databases/activity_recognition/collections/entropy_data?f={%20mean0%22:%201}&apiKey=myApiKey


String apiURI = "https://api.mongolab.com/api/1/databases/activity_recognition/collections/entropy_data?f={%22mean0%22:%201}&apiKey=myApiKey";
  • 当我把这个URI粘贴到浏览器中时,它可以正常工作。
  • 当我将其粘贴到浏览器中,打开它,然后将URI复制回我的代码中时,它没有起到作用。
  • 索引89是{ - 这是一个非法字符吗?

我尝试过这样做 - 用%7B替换花括号:但这并没有起到作用。

https://api.mongolab.com/api/1/databases/activity_recognition/collections/entropy_data?f=%7B"mean0":%201%7D&apiKey=myApiKey

有人吗?


编辑:

    String query = "https://api.mongolab.com/api/1/databases/activity_recognition/collections/entropy_data?f={\""+arrayName+"\":%201}&apiKey=myApiKey";
    try {
        query = URLEncoder.encode(query, "utf-8");
    } catch (UnsupportedEncodingException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    String apiURI = query;

不起作用。现在我得到了:
05-23 22:13:21.855: E/SendMail(12428): Target host must not be null, or set in parameters. scheme=null, host=null, path=https://api.mongolab.com/api/1/databases/activity_recognition/collections/entropy_data?f={"mean0":%201}&apiKey=myAPI

如果我在查询声明中将%20更改为空格,则会出现以下错误:
 05-23 22:14:51.435: E/SendMail(13164): Target host must not be null, or set in parameters. scheme=null, host=null, path=https://api.mongolab.com/api/1/databases/activity_recognition/collections/entropy_data?f={"mean0":+1}&apiKey=myAPI

如果我不在中间使用arrayName字符串,而是直接使用浏览器中的字符串,效果是一样的!


尝试将 : 编码为 %3A,最好使用 URLEncoder 而不是像你所做的那样硬编码一个已编码的字符串。 - FoamyGuy
URLEncoder也无济于事。 - LucasSeveryn
你可以尝试使用Base 64 URL编码,看看是否有帮助。请参考这个答案。 - Shobhit Puri
3个回答

5

据我所见,所有的尝试都会错过某些内容,编码一些不应该编码的内容(例如“?”),或是重复编码某些内容,以致于在url编码中对“%”进行了编码。

那么,为什么不仅编码需要转义的部分,而且只编码一次呢?

String apiURI =
    "https://api.mongolab.com/api/1/databases/activity_recognition/collections/entropy_data?f="
    + URLEncoder.encode("{\"mean0\": 1}", "UTF-8")
    + "&apiKey=myApiKey";

如果您想使用java.net.URI,您需要单独包含查询字符串,例如:
new URI(
    "https",
    "api.mongolab.com",
    "/api/1/databases/activity_recognition/collections/entropy_data",
    "f={\"mean0\": 1}&apiKey=myApiKey",
    null
  ).toURL()

请注意,正确转义的URL应为https://api.mongolab.com/api/1/databases/activity_recognition/collections/entropy_data?f=%7B%22mean0%22:%201%7D&apiKey=myApiKey - Daniel Woffinden

-1

另一种做法是:

uri = new URI("https", 
"api.mongolab.com", 
"/api/1/databases/activity_recognition/collections/entropy_data?f={\"mean\": 1}&apiKey=myApiKey", null);
URL url = uri.toURL();

请注意,我将%22(URL编码引号)更改为\"(转义引号),否则您将最终得到您的%符号被URL编码的结果。
澄清一下,这样做的目的是:
String query = "https://api.mongolab.com...";
query = URLEncoder.encode(query, "utf-8");

你最终会得到 https%3A%2F%2Fapi.mongolab.com。


仍然不起作用。它将URL转换为https://api.mongolab.com/api/1/databases/activity_recognition/collections/entropy_data%3Ff=%7B%22mean0%22:%201%7D&apiKey=myAPI,即使我将其粘贴到浏览器中也无法工作。 - LucasSeveryn

-2

我猜你正在寻找这样的东西

String flag1 = URLEncoder.encode("This string has spaces", "UTF-8");

您可以参考Oracle URL编码器的文档或者参考SOF


你在网页浏览器中输入什么才能得到正确的结果。 - MDMalik
这个链接是:https://api.mongolab.com/api/1/databases/activity_recognition/collections/entropy_data?f={"mean0":%201}&apiKey=myApiKey - LucasSeveryn
或者这个:https://api.mongolab.com/api/1/databases/activity_recognition/collections/entropy_data?f={%22"mean0":%201}&apiKey=myApiKey - LucasSeveryn
每次我收到这个消息 "{ "message" : "Please provide a valid API key."}" 你的 myApiKey 是否已经初始化了?只是好奇。 - MDMalik
我不想分享允许修改我的数据库的 API 密钥。 "myApiKey" 只是一个占位符。 - LucasSeveryn
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接