首先,让我首先说我完全没有使用OData4j。
我正在构建一个Android应用程序(使用Eclipse),需要从Web服务中消耗一些OData,我们已经有一个iPad应用程序已经正常工作,所以我认为对Web服务是安全的。
所有网络请求都需要基本身份验证才能运行,我可以使用浏览器进行调用,以确认我使用的网址和凭据是否有效。
到目前为止,我有这段代码:
ODataConsumer.Builder builder = ODataConsumers.newBuilder(url);
builder.setClientBehaviors(new BasicAuthenticationBehavior(LoginUsername, LoginPassword));
ODataConsumer c = builder.build();
for(OEntity entity : c.getEntities("entry").execute()){
System.out.println(entity.getProperty("name").getValue().toString());
}
目前,Eclipse调试器在for
行上失败,在.execute()
调用期间可以推测。调试器对我来说是零帮助,在LogCat中看起来与半相关的唯一一行是:
编辑:在@ JohnSpurlock的回答之后,我进一步了解了一下。总体上存在同样的问题,但是出现了一条新的错误消息:
BadRequestException:请求URI无效。自从细分 '文件'是指一个集合,这必须是最后一个集合 请求网址。所有中间段必须引用单个段 资源。
还有其他消息,但主要与线程有关 - 值得注意的是,此方法是从AsyncTask内调用的,但是当{{1}内的任何内容发生时,通常会出现线程错误}}
我的XML结果的审查和缩短版本(通过浏览器)如下所示:
AsyncTask
答案 0 :(得分:2)
我已经找到了解决方案。
首先,感谢John Spurlock让我朝着正确的方向迈出了一步,我需要首先在清单文件中包含正确的INTERNET权限:
<uses-permission android:name="android.permission.INTERNET" />
接下来是查询的问题,本质上问题在于我对OData的结构和查询缺乏了解。当我创建ODataConsumer
时,我正在传递完整的网址查询,但我只需要传递基本.SVC
路径。
所以不是这样:
ODataConsumer.Builder builder = ODataConsumers.newBuilder("http://a.example.com/OData.svc/Documents");
我这样做了:
ODataConsumer.Builder builder = ODataConsumers.newBuilder("http://a.example.com/OData.svc");
然后在查询entites时指定Documents
部分:
for(OEntity entity : c.getEntities("Documents").execute().toList()){
}
我的原始XML被删减了,实际上包含了一些属性元素。起初我认为feed
和entry
元素本身就是实体,所以我在尝试查询时遇到了问题,但它们实际上是OData魔法的一部分,似乎是标准定义的元素,所以这些由OData4j自动处理。
然后可以通过以下方式查询每个属性:
String myProperty = entity.getProperty("MyProperty").getValue().toString();
答案 1 :(得分:1)
听起来你是Android开发的新手。要进行任何网络通话,您需要为应用的Android清单xml添加互联网权限。
<uses-permission android:name="android.permission.INTERNET" />
答案 2 :(得分:1)
在execute()中可能存在问题,默认情况下它不是返回列表。请使用以下代码并尝试。
for(OEntity entity : c.getEntities("entry").execute().**toList()**){
System.out.println(entity.getProperty("name").getValue().toString());
}