URLConnection 404仅适用于Android,不适用于简单Java
我正在外部托管服务器上获取JSON。我已经编写了两个单独的JUnit测试来测试网络请求,其中一个在Android环境中测试,另一个只运行标准的PC JUnit(不在Android上运行) 当我使用基于非Android的JUnit(简单java程序)测试时,URLConnection工作正常,我从URLConnection和JSON收到200的响应代码。然而,当我在Android设备上运行相同的静态函数时,我收到一个404的响应代码(找不到文件或位置)。url本身是经过编码的,不包含任何非ASCII字符 为了不向主机服务器发送垃圾邮件,我将url替换为 我尝试过的事情: 1.最初的实施:URLConnection 404仅适用于Android,不适用于简单Java,java,android,json,networking,Java,Android,Json,Networking,我正在外部托管服务器上获取JSON。我已经编写了两个单独的JUnit测试来测试网络请求,其中一个在Android环境中测试,另一个只运行标准的PC JUnit(不在Android上运行) 当我使用基于非Android的JUnit(简单java程序)测试时,URLConnection工作正常,我从URLConnection和JSON收到200的响应代码。然而,当我在Android设备上运行相同的静态函数时,我收到一个404的响应代码(找不到文件或位置)。url本身是经过编码的,不包含任何非ASCI
URL url = new URL("http://example.com/JSONLink");
System.out.println(url);
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
int problem = urlConnection.getResponseCode();
urlConnection.connect();
System.out.println("The error code is " + problem);
InputStream inputStream = urlConnection.getInputStream();
此时,urlConnection抛出一个文件未找到错误。我也尝试过转换
urlConnection.getInputStream();
到
错误流给了我一个HTML文件,说明服务器无法找到该文件。
2.确保Android清单包含Internet的用户权限
<uses-permission android:name="android.permission.INTERNET" />
提前感谢在这种情况下,通常建议的第一步是交叉检查服务器。这个答案是你的问题 如果这个问题是服务器端的,有没有一种方法可以模拟浏览器来获取json 对。您可以尝试这些chrome插件中的任何一个,以测试您的服务器是否能从您的浏览器中提供预期的响应 1) 高级REST客户端 2) 邮递员
“错误流向我提供了一个HTML文件,说明服务器无法找到该文件”--要么您的URL输入不正确,要么服务器不喜欢该请求。检查服务器日志,查看与您的请求相关的内容。我无法直接访问服务器,因为它是由不知道我正在处理此问题的第三方运行的。我正在开发一个概念验证应用程序。因此,我认为我无法访问服务器日志。但是,我能够在发送到服务器之前打印出url,并且可以使用不同的浏览器到达目的地。“我没有直接访问服务器的权限,因为它是由第三方运行的,而第三方不知道我正在处理此问题”--那么您就没有可靠的方法来解决此问题。欢迎你玩带有用户代理值的游戏,试图“伪造”服务器,但你被黑客攻击的值可能会在将来停止工作。这让我解决了我的问题!我缺少一个头部accept:application/json,我在
urlConnection.setRequestProperty(“accept”,“application/json”)行中添加了它代码>这是关键!
<uses-permission android:name="android.permission.INTERNET" />
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet("http://example.com/JSONLink");
HttpResponse httpResponse = httpClient.execute(httpGet);
HttpEntity httpEntity = httpResponse.getEntity();
InputStream inputStream = httpEntity.getContent();