2013-04-05 20 views
2

首先,讓我開始說我已經完全沒有使用OData4j。使用基本身份驗證的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> 

回答

2

我已經制定出解決方案。

首先,感謝約翰·斯普爾洛克爲我安排在正確的方向邁出的一步,我需要首先要在清單文件中的正確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"); 

然後,您查詢的的entites時指定Documents部分:

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

} 

我原來的XML是減少,實際上包含一些屬性元素。起初,我認爲feedentry元素的實體在自己的,所以我有一個問題時,試圖查詢它們,但它們實際上是OData魔術的一部分,似乎是標準的定義元素,所以這些都由OData4j自動處理。

每個屬性然後可以通過查詢,像這樣:

String myProperty = entity.getProperty("MyProperty").getValue().toString(); 
1

聽起來像是你是新來的Android開發。要完成任何網絡調用,您需要將Internet權限添加到您應用的Android清單xml中。

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

這無疑讓我更進一步謝謝你,我還是原來的問題,所以我不能接受,但你得到一票。我之前(稍後)已經完成了幾個小型Android應用程序,但都沒有使用互聯網接入。 – musefan 2013-04-05 10:55:53

1

在execute()中可能有問題,默認情況下它沒有返回列表。請使用下面的代碼並嘗試。

for(OEntity entity : c.getEntities("entry").execute().**toList()**){ 
    System.out.println(entity.getProperty("name").getValue().toString()); 
} 
+0

我已經試過這個,但仍然是同樣的問題,我添加了互聯網許可後,我現在有一個新的錯誤,所以我會更新我的問題,但它是'BadRequestException:請求URI無效。由於「文檔」段是指集合,因此它必須是請求URL中的最後一個分段。所有中間段都必須引用單個資源。有任何想法嗎? – musefan 2013-04-05 10:58:34

+0

終於找出解決方案後,我可以確認這個答案實際上並沒有幫助。如果我使用'toList()'或沒有區別 – musefan 2013-04-05 11:51:28