此URI URL有什么问题?IllegalArgumentException,非法字符

Luc*_*ryn 4 java rest android uri mongodb

我收到一个错误:

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";
Run Code Online (Sandbox Code Playgroud)
  • 当我将此URI粘贴到浏览器中时,它可以正常工作。
  • 当我粘贴到浏览器中时,将其打开,然后将URI复制回我的代码中,这无济于事。
  • 索引89是{-这是一个非法字符吗?

我尝试这样做-用%7B代替大括号:但这无济于事

https://api.mongolab.com/api/1/databases/activity_recognition/collections/entropy_data?f=%7B"mean0":%201%7D&apiKey=myApiKey
Run Code Online (Sandbox Code Playgroud)

任何人?


编辑:

    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;
Run Code Online (Sandbox Code Playgroud)

没有帮助。现在我得到:

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
Run Code Online (Sandbox Code Playgroud)

如果我在查询的声明中将%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
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*den 5

从我所看到的情况来看,每次尝试要么遗漏某些东西,要么对其进行不应编码的内容(例如“?”),或者对某些内容进行双重编码,从而对url编码中的“%”进行url编码。

只编码您关心的转义位,并只进行一次编码怎么样?

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

如果要使用java.net.URI,则必须单独包含查询字符串,例如:

new URI(
    "https",
    "api.mongolab.com",
    "/api/1/databases/activity_recognition/collections/entropy_data",
    "f={\"mean0\": 1}&apiKey=myApiKey",
    null
  ).toURL()
Run Code Online (Sandbox Code Playgroud)