【问题标题】:HttpURLConnection FileNotFoundException with Response Code 200带有响应代码 200 的 HttpURLConnection FileNotFoundException
【发布时间】:2018-01-16 23:10:29
【问题描述】:

我正在尝试从 Twitch 的 Helix API 检索一些带有 GameId 的视频。使用 REST 客户端我可以检索数据并且它可以工作,但是当我在 android 上尝试它时它不会工作。 我得到一个响应代码 200,但是当我尝试访问 InputStream 时,我得到一个 FileNotFoundException。

这是我正在使用的代码:

        HttpURLConnection urlConnection = null;
        URL url = new URL(urlString);
        urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.setRequestProperty("Client-ID", Configuration.TWITCH_CLIENT_ID);
        urlConnection.setRequestMethod("GET");
        urlConnection.connect();

        System.out.println("ResponseCode: " + urlConnection.getResponseCode());

        BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()));
        StringBuilder sb = new StringBuilder();

        String line;
        while ((line = br.readLine()) != null) {
            sb.append(line + "\n");
        }
        br.close();

        String jsonString = sb.toString();
        System.out.println("JSON: " + jsonString);

        return new JSONObject(jsonString);

Configuration.TWITCH_CLIENT_ID 是我的 Twitch 客户端 ID。 我得到的输出是:

01-16 02:19:19.658 21184-21242/ec.com.aurinow.aurinow I/System.out: ResponseCode: 200
01-16 02:19:20.133 21184-21242/ec.com.aurinow.aurinow W/System.err: java.io.FileNotFoundException: https://api.twitch.tv/helix/videos?game_id=9435
01-16 02:19:20.133 21184-21242/ec.com.aurinow.aurinow W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:238)
01-16 02:19:20.133 21184-21242/ec.com.aurinow.aurinow W/System.err:     at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210)
01-16 02:19:20.133 21184-21242/ec.com.aurinow.aurinow W/System.err:     at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java)
01-16 02:19:20.133 21184-21242/ec.com.aurinow.aurinow W/System.err:     at java.net.URL.openStream(URL.java:470)
01-16 02:19:20.133 21184-21242/ec.com.aurinow.aurinow W/System.err:     at ec.com.aurinow.aurinow.TwitchSearchActivity$RetrieveResponseTask.sendRequest(TwitchSearchActivity.java:272)
01-16 02:19:20.133 21184-21242/ec.com.aurinow.aurinow W/System.err:     at ec.com.aurinow.aurinow.TwitchSearchActivity$RetrieveResponseTask.doInBackground(TwitchSearchActivity.java:233)
01-16 02:19:20.133 21184-21242/ec.com.aurinow.aurinow W/System.err:     at ec.com.aurinow.aurinow.TwitchSearchActivity$RetrieveResponseTask.doInBackground(TwitchSearchActivity.java:229)
01-16 02:19:20.133 21184-21242/ec.com.aurinow.aurinow W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:295)
01-16 02:19:20.134 21184-21242/ec.com.aurinow.aurinow W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
01-16 02:19:20.134 21184-21242/ec.com.aurinow.aurinow W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
01-16 02:19:20.134 21184-21242/ec.com.aurinow.aurinow W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
01-16 02:19:20.134 21184-21242/ec.com.aurinow.aurinow W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
01-16 02:19:20.134 21184-21242/ec.com.aurinow.aurinow W/System.err:     at java.lang.Thread.run(Thread.java:818)

谢谢大家

编辑:所以我使用urlConnection.getInputStream() 而不是url.openStream() 使其工作。我不知道为什么在这种特定情况下它会这样工作。

【问题讨论】:

  • 尝试urlConnection.getInputStream() 而不是url.openStream()
  • @Barns 是的,我刚刚编辑了这个问题,说我这样做了。我不知道为什么 url.openStream() 不起作用。谢谢
  • 那么urlConnection.getInputStream() 现在可以工作了吗?
  • 是的,它适用于urlConnection.getInputStream()

标签: android httpurlconnection twitch


【解决方案1】:

您应该从HttpURLConnection 对象获得响应。那就是响应的地方。

URL 对象如文档所述:

类 URL 代表一个统一资源定位器,一个指向 万维网上的“资源”。

所以URL 只指向您希望从中检索的资源。 HttpURLConnection 对象实际上包含指向资源后的响应。

HttpURLConnection 对象:

每个 HttpURLConnection 实例用于发出单个请求,但 与 HTTP 服务器的底层网络连接...

所以改为这样做: (new InputStreamReader(urlConnection.getInputStream()));

HttpURLConnection urlConnection = null;
URL url = new URL(urlString);
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestProperty("Client-ID", Configuration.TWITCH_CLIENT_ID);
urlConnection.setRequestMethod("GET");
urlConnection.connect();

System.out.println("ResponseCode: " + urlConnection.getResponseCode());

BufferedReader br = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
StringBuilder sb = new StringBuilder();

String line;
while ((line = br.readLine()) != null) {
    sb.append(line + "\n");
}
br.close();

String jsonString = sb.toString();
System.out.println("JSON: " + jsonString);

return new JSONObject(jsonString);

【讨论】:

  • 这就是它起作用的原因,但我仍然怀疑为什么有时url.openStream() 会起作用,而有时却不会。
猜你喜欢
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
  • 2014-09-21
  • 2016-12-14
  • 1970-01-01
  • 2013-09-08
  • 1970-01-01
相关资源
最近更新 更多