为什么是以下代码
URL url = new URL(urlStr);
Log.d(TAG, "Opening URL " + url.toString());
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);
urlConnection.connect();
String response = streamToString(urlConnection.getInputStream());
总是在urlConnection.getInputStream()
给我以下例外?
W/System.err(16253): java.io.FileNotFoundException: https://api.instagram.com/v1/media/search/access_token=1559619173.3c922fe.4fd71e26225a42a0a03fdd90ef8679a6?lat=48.858318956&lng=2.294427258&distance=500
W/System.err(16253): at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:186)
W/System.err(16253): at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:246)
W/System.err(16253): at br.com.dina.oauth.instagram.InstagramApp$5.run(InstagramApp.java:192)
答案 0 :(得分:4)
您应该删除urlConnection.setDoOutput(true);
行,因为setDoOutput
方法强制POST但instagram api工作GET方法。
您也可以查看此问题。
https://github.com/thiagolocatelli/android-instagram-oauth/issues/2
答案 1 :(得分:1)
抛出异常的代码可以在okhttp github中找到(Android在内部使用它)。负责的行是:
if (getResponseCode() >= HTTP_BAD_REQUEST) {
throw new FileNotFoundException(url.toString());
}
这只是意味着您提供的网址没有带来成功的响应。抛出*File*NotFoundException
行为okhttp只是从其他实现复制。为什么有人选择这个特殊例外超出了我的范围。
如果您只是将错误消息中的网址放入浏览器中,您会看到“未找到”页面。
解释很简单:您构建的URL错误。而不是
search/access_token=...?lat=...
它需要
search?access_token=...&lat=...
access_token
是一个url参数,不是路径的一部分,因此它需要将?
作为分隔符,而lat
成为第二个参数,这意味着?
需要变成&
。