OData4j查询使用基本身份验证

时间:2013-04-05 10:39:38

标签: java android odata odata4j

首先,让我首先说我完全没有使用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

3 个答案:

答案 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被删减了,实际上包含了一些属性元素。起初我认为feedentry元素本身就是实体,所以我在尝试查询时遇到了问题,但它们实际上是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());
}