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 は省略されており、実際にはいくつかのプロパティ要素が含まれています。最初は、エンティティが存在する 要素feedentry要素が単独であると考えたので、それらをクエリしようとすると問題が発生しましたが、実際には 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 に答える