我有一个在Spring Tool Suite中制作的Android应用程序和REST服务器。 REST连接到数据库并根据GET请求中的查询返回Json对象列表。 这是我对GET方法的REST响应
@RequestMapping(value = "/short", method = RequestMethod.GET)
public Map<String,List<Temperature>> shortPeriod(@RequestParam(value = "time",required = false)
@DateTimeFormat(pattern="yyyy:MM:dd HH:mm:ss") Date time){
Map<String, List<Temperature>> results = new HashMap<String, List<Temperature>>();
List<Temperature> temperatureList = new ArrayList<Temperature>();
System.out.println("TEST!");
try {
temperatureList = dataServices.getEntityList(time,"short");
results.put("data", temperatureList);
} catch (Exception e) {
e.printStackTrace();
}
return results;
}
这就是我在android上连接的方式
String tempUrl = new String("http://" + IP + ":8080/" + "RestServer/temperature/" + tableName + "?time=" + urlQueryTimestamp);
String encodedUrlTemp = tempUrl.replace(" ", "%20");
String encodedUrl = encodedUrlTemp.replace("-", ":");
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setDoInput(true);
connection.setDoOutput(true);
connection.connect();
我已将测试打印件和它的工作正常,直到connection.connect();
网址看起来像这样
http://192.168.1.106:8080/RestServer/temperature/short?time=2015:06:05%2010:20:03
我打印&#34; url&#34;在连接之前变量,当我拿到那个url并将其粘贴到chrome中时,我会得到正常的响应。但是,当我尝试在我的应用程序中连接时,我得到了#34;方法不允许&#34;。我找到了一些关于该异常的解决方案,并且通常在服务器上没有实现POST方法的问题,但是使用相同的url我在计算机上的chrome上获得了正常的响应,甚至在智能手机上的我的移动chrome上也是如此。 另一件事是我有一个其他服务器用硬编码的json数据进行测试,当http请求中没有查询时我可以正常连接,所以只有这个 http://192.168.1.106:8080/RestServer/temperature/short
所以我的假设是chrome在内部转义一些字符串或者在使用查询时自行设置一些标题信息,而android并没有。服务器甚至没有记录我在上面代码中粘贴的请求,就像我发送了错误的网址一样。
另外一件事,我尝试使用Android库中的url编码器,但它逃脱了一些不应该被转义的字母,我读到它为了html而逃脱了它,所以我手动做(也许我& #39;做错了)。
我关闭了防火墙,检查了ip地址十几次,我没有更多想法。
答案 0 :(得分:0)
在尝试完所有逃避,更改库以及阅读URI和URL的解决方案之后,我在android开发者文档页面上找到了解决方案,其中说:
HttpURLConnection默认使用GET方法。 如果是,它将使用POST setDoOutput(true)被称为。其他HTTP方法(OPTIONS,HEAD, PUT,DELETE和TRACE)可以与setRequestMethod(String)一起使用。
希望这有助于某人