对于查询中的非法字符,相同的URL失败

时间:2014-04-22 22:44:47

标签: java android url uri

我很难理解这是怎么回事。我已经对URL编码做了一些阅读,并且很困惑为什么传递相同的字符串,但是通过httpurirequest构建的字符串失败。

list = 1336463

String listing2 = new String("https://api.prosper.com/api/Listings$filter=ListingNumber%20eq%20" + list);

虽然这有效

    String listing2 = new String("https://api.prosper.com/api/Listings?$filter=ListingNumber%20eq%201336463");

这两个产生相同的字符串。

这是我的stacktrace

     04-22 17:14:43.196: D/Plog(28329): https://api.prosper.com/api/Listings?$filter=ListingNumber%20eq%201336463 
04-22 17:14:43.196: D/AbsListView(28329): onVisibilityChanged() is called, visibility : 0
04-22 17:14:43.196: D/AbsListView(28329): unregisterIRListener() is called 
04-22 17:14:43.196: W/dalvikvm(28329): threadid=13: thread exiting with uncaught exception (group=0x41848898)
04-22 17:14:43.206: D/AbsListView(28329): unregisterIRListener() is called 
04-22 17:14:43.246: D/AbsListView(28329): unregisterIRListener() is called 
04-22 17:14:43.276: D/AbsListView(28329): unregisterIRListener() is called 
04-22 17:14:43.286: D/AbsListView(28329): unregisterIRListener() is called 
04-22 17:14:43.306: E/AndroidRuntime(28329): FATAL EXCEPTION: AsyncTask #3
04-22 17:14:43.306: E/AndroidRuntime(28329): java.lang.RuntimeException: An error occured while executing doInBackground()
04-22 17:14:43.306: E/AndroidRuntime(28329):    at android.os.AsyncTask$3.done(AsyncTask.java:299)
04-22 17:14:43.306: E/AndroidRuntime(28329):    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
04-22 17:14:43.306: E/AndroidRuntime(28329):    at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
04-22 17:14:43.306: E/AndroidRuntime(28329):    at java.util.concurrent.FutureTask.run(FutureTask.java:239)
04-22 17:14:43.306: E/AndroidRuntime(28329):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
04-22 17:14:43.306: E/AndroidRuntime(28329):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
04-22 17:14:43.306: E/AndroidRuntime(28329):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
04-22 17:14:43.306: E/AndroidRuntime(28329):    at java.lang.Thread.run(Thread.java:841)
04-22 17:14:43.306: E/AndroidRuntime(28329): Caused by: java.lang.IllegalArgumentException: Illegal character in query at index 73: https://api.prosper.com/api/Listings?$filter=ListingNumber%20eq%201336463 
04-22 17:14:43.306: E/AndroidRuntime(28329):    at java.net.URI.create(URI.java:727)
04-22 17:14:43.306: E/AndroidRuntime(28329):    at org.apache.http.client.methods.HttpGet.<init>(HttpGet.java:75)
04-22 17:14:43.306: E/AndroidRuntime(28329):    at com.example.prosperapp.ListingDetail.listingscall(ListingDetail.java:323)
04-22 17:14:43.306: E/AndroidRuntime(28329):    at com.example.prosperapp.ListingDetail$CallAPI.doInBackground(ListingDetail.java:136)
04-22 17:14:43.306: E/AndroidRuntime(28329):    at com.example.prosperapp.ListingDetail$CallAPI.doInBackground(ListingDetail.java:1)
04-22 17:14:43.306: E/AndroidRuntime(28329):    at android.os.AsyncTask$2.call(AsyncTask.java:287)
04-22 17:14:43.306: E/AndroidRuntime(28329):    at java.util.concurrent.FutureTask.run(FutureTask.java:234)
04-22 17:14:43.306: E/AndroidRuntime(28329):    ... 4 more

修剪弦后,我现在看到了。

04-22 18:49:18.202: I/System.out(3829): 54
04-22 18:49:18.202: I/System.out(3829): 51
04-22 18:49:18.202: D/AbsListView(3829): onVisibilityChanged() is called, visibility : 4
04-22 18:49:18.202: D/AbsListView(3829): unregisterIRListener() is called 
04-22 18:49:18.202: W/dalvikvm(3829): threadid=13: thread exiting with uncaught exception (group=0x41848898)
04-22 18:49:18.222: D/AbsListView(3829): onVisibilityChanged() is called, visibility : 0
04-22 18:49:18.222: D/AbsListView(3829): unregisterIRListener() is called 
04-22 18:49:18.222: D/AbsListView(3829): unregisterIRListener() is called 
04-22 18:49:18.222: E/AndroidRuntime(3829): FATAL EXCEPTION: AsyncTask #3
04-22 18:49:18.222: E/AndroidRuntime(3829): java.lang.RuntimeException: An error occured while executing doInBackground()
04-22 18:49:18.222: E/AndroidRuntime(3829):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
04-22 18:49:18.222: E/AndroidRuntime(3829):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
04-22 18:49:18.222: E/AndroidRuntime(3829):     at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
04-22 18:49:18.222: E/AndroidRuntime(3829):     at java.util.concurrent.FutureTask.run(FutureTask.java:239)
04-22 18:49:18.222: E/AndroidRuntime(3829):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
04-22 18:49:18.222: E/AndroidRuntime(3829):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
04-22 18:49:18.222: E/AndroidRuntime(3829):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
04-22 18:49:18.222: E/AndroidRuntime(3829):     at java.lang.Thread.run(Thread.java:841)
04-22 18:49:18.222: E/AndroidRuntime(3829): Caused by: java.lang.StringIndexOutOfBoundsException: length=73; index=73
04-22 18:49:18.222: E/AndroidRuntime(3829):     at com.example.prosperapp.ListingDetail.listingscall(ListingDetail.java:323)
04-22 18:49:18.222: E/AndroidRuntime(3829):     at com.example.prosperapp.ListingDetail$CallAPI.doInBackground(ListingDetail.java:137)
04-22 18:49:18.222: E/AndroidRuntime(3829):     at com.example.prosperapp.ListingDetail$CallAPI.doInBackground(ListingDetail.java:1)
04-22 18:49:18.222: E/AndroidRuntime(3829):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
04-22 18:49:18.222: E/AndroidRuntime(3829):     at java.util.concurrent.FutureTask.run(FutureTask.java:234)
04-22 18:49:18.222: E/AndroidRuntime(3829):     ... 4 more

1 个答案:

答案 0 :(得分:0)

考虑:

Caused by: java.lang.IllegalArgumentException:
    Illegal character in query at index 73:
      https://api.prosper.com/api/Listings?$filter=ListingNumber%20eq%201336463 
    at java.net.URI.create(URI.java:727)

堆栈跟踪中显示的URI似乎只有73个字符长(因此,索引从0到72)。在它的末尾必须有一些控制字符导致它失败。

试试这个:

System.out.println((int) listing2.charAt(73));

我认为您会发现字符串末尾有回车符,换行符或CRLF序列。任何换行序列都会导致您看到的异常。