2

首先,让我先说我完全没有使用 OData4j。

我正在构建一个需要从 Web 服务消耗一些 OData 的 android 应用程序(使用 Eclipse),我们已经有一个 iPad 应用程序可以正常工作,所以我认为 Web 服务是安全的。

所有 Web 请求都需要基本身份验证才能工作,我可以使用浏览器进行调用,以确认我使用的 URL 和凭据有效。

到目前为止,我有这个代码:

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 无效。由于“文档”段指的是一个集合,因此它必须是请求 URL 中的最后一个序列。所有中间段必须引用单个资源。

还有其他消息,但主要与线程有关 - 值得注意的是,此方法是从AsyncTask中调用的,但是当AsyncTask.

我的 XML 结果的审查和缩短版本(通过浏览器)如下所示:

<feed xml:base="http://a.example.com/OData.svc/" 
    xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" 
    xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" 
    xmlns="http://www.w3.org/2005/Atom">
    <entry>
        <name>one</name>
    </entry>
    <entry>
        <name>two</name>
    </entry>
</feed>
4

3 回答 3

2

我已经制定了解决方案。

首先,感谢 John Spurlock 让我朝着正确的方向迈出了一步,我需要首先在清单文件中包含正确的 INTERNET 权限:

<uses-permission android:name="android.permission.INTERNET" />

然后是查询的问题,本质上问题在于我对 OData 的结构和查询方式缺乏了解。当我创建时,ODataConsumer我传递了完整的 URL 查询,但是我只需要传递基本.SVC路径。

所以而不是这个:

ODataConsumer.Builder builder = ODataConsumers.newBuilder("http://a.example.com/OData.svc/Documents");

我这样做了:

ODataConsumer.Builder builder = ODataConsumers.newBuilder("http://a.example.com/OData.svc");

然后在查询实体时指定Documents零件:

for(OEntity entity : c.getEntities("Documents").execute().toList()){

}

我原来的 XML 被删减了,实际上包含了一些属性元素。起初我认为feedandentry元素是它们自己的实体,所以我在尝试查询它们时遇到了问题,但它们实际上是 OData 魔法的一部分,并且似乎是标准定义的元素,所以这些由 OData4j 自动处理。

然后可以像这样查询每个属性:

String myProperty = entity.getProperty("MyProperty").getValue().toString();
于 2013-04-05T11:47:27.543 回答
1

听起来您是 Android 开发的新手。要进行任何网络调用,您需要将互联网权限添加到应用的 Android 清单 xml。

<uses-permission android:name="android.permission.INTERNET" />
于 2013-04-05T10:49:03.313 回答
1

execute() 中可能存在问题,默认情况下它不返回列表。请使用以下代码并尝试。

for(OEntity entity : c.getEntities("entry").execute().**toList()**){
    System.out.println(entity.getProperty("name").getValue().toString());
}
于 2013-04-05T10:52:46.077 回答