AndroidアプリでLiferayサービスを呼び出す

AndroidアプリでLiferayサービスを呼び出す

ご覧のページは、お客様の利便性のために一部機械翻訳されています。また、ドキュメントは頻繁に更新が加えられており、翻訳は未完成の部分が含まれることをご了承ください。最新情報は都度公開されておりますため、必ず英語版をご参照ください。翻訳に問題がある場合は、こちらまでご連絡ください。

Androidプロジェクトで適切なMobile SDKを設定したら、アプリでLiferay DXPサービスにアクセスして呼び出すことができます。このチュートリアルでは、これらのサービスを呼び出すために従う必要がある手順を説明します。

  1. セッションを作成します。
  2. 呼び出す必要があるLiferay DXPサービスをインポートします。
  3. サービスオブジェクトを作成し、サービスメソッドを呼び出します。

一部のサービスコールには特別な処理が必要なため、このチュートリアルではそれらの処理方法も示します。 しかし、最初に、ポータルでLiferay DXPのJSON Webサービスを保護する方法を学びます。

JSON Webサービスの保護

Liferay Mobile SDKは、デフォルトで有効になっているLiferay DXPのJSON Webサービスを呼び出します。 Mobile SDKを介して呼び出すWebサービスは、それらの呼び出しが機能するように有効にしておく必要があります。 ただし、呼び出す必要のないWebサービスを無効にすることは可能です。 この手順については、チュートリアル JSON Webサービスの設定参照してください。 サービスアクセスポリシー を使用して、アクセス可能なサービスをより詳細に制御することもできます。

ステップ1:セッションを作成する

セッションは、クライアントとサーバー間の変換状態であり、2つの間の複数の要求と応答で構成されます。 アプリとMobile SDKの間でリクエストを渡すにはセッションが必要です。 ほとんどの場合、ユーザー認証を使用してセッションを作成する必要があります。 セッションの作成に必要なインポートとコードは次のとおりです。

import com.liferay.mobile.android.auth.basic.BasicAuthentication;
import com.liferay.mobile.android.service.Session;
import com.liferay.mobile.android.service.SessionImpl;
...
Session session = new SessionImpl("http://10.0.2.2:8080", 
    new BasicAuthentication("test@example.com", "test"));

SessionImpl の引数は、セッションを作成するために使用されます。 最初のパラメーターは、接続しているLiferayインスタンスのURLです。 Android Studioのエミュレーターでアプリを実行している場合、 http://10.0.2.2:8080http:// localhost:8080と同等です。 これをサーバーの正しいアドレスに置き換えてください。

2番目のパラメーターは、ユーザーの資格情報を含む新しい BasicAuthentication オブジェクトを作成します。 Liferayインスタンスで使用される認証方法に応じて、ユーザーの電子メールアドレス、スクリーン名、またはユーザーIDを提供する必要があります。 ユーザーのパスワードも入力する必要があります。 BasicAuthentication オブジェクトは、基本認証を使用して各サービスコールを認証するようセッションに指示します。 OAuthプロバイダーポートレットがLiferayインスタンスにデプロイされている限り、Mobile SDKはOAuth認証もサポートします。 Mobile SDKでOAuth認証を使用する方法については、 OAuthサンプルアプリご覧ください。 また、OAuthプロバイダーポートレットは、アクティブなLiferayサブスクリプションをお持ちのお客様のみが利用できることに注意してください。

アプリのサインインビューを作成する場合は、 SignIn ユーティリティクラスを使用して、ユーザーが指定した資格情報が有効かどうかを確認できます。

import com.liferay.mobile.android.auth.SignIn;
...
SignIn.signIn(session, new JSONObjectAsyncTaskCallback() {

    @Override
    public void onSuccess(JSONObject userJSONObject) {
        System.out.println("Successful sign-in, user details: " + userJSONObject)
    }

    @Override
    public void onFailure(Exception e) {
        e.printStackTrace();
    }

});

Mobile SDKはサーバーとの永続的な接続またはセッションを保持しないことに注意してください。 各リクエストはユーザーの資格情報とともに送信されます(OAuthを使用する場合を除く)。 ただし、 SignIn クラスは、サインインが成功した後にユーザー情報を返す方法を提供します。

次に、これが可能な限られたケースで認証されていないセッションを作成する方法を示します。

認証されていないセッションの作成

場合によっては、ユーザーの資格情報なしで セッション インスタンスを作成することが可能です。 ただし、ほとんどのLiferayリモートメソッドは、認証されていないリモート呼び出しを受け入れません。 認証されていないセッションで呼び出しを行うと、ほとんどの場合、 認証アクセスが必要な 例外が生成されます。

認証されていないサービス呼び出しは、Liferayインスタンスまたはプラグインのリモートメソッドに @AccessControlled 注釈がある場合にのみ機能します。 これは、架空のクラス FooServiceImpl とそのメソッド barに対して示されています。

import com.liferay.portal.security.ac.AccessControlled;
...
public class FooServiceImpl extends FooServiceBaseImpl {
...
    @AccessControlled(guestAccessEnabled = true)
    public void bar() { ... }
...

このような呼び出しを行うには、サーバーURLのみを受け入れるコンストラクターを使用する必要があります。

Session session = new SessionImpl("http://10.0.2.2:8080");

ファンタスティック\! セッションができたので、それを使用してLiferayのサービスを呼び出すことができます。

ステップ2:必要なLiferayサービスをインポートする

最初に、呼び出す必要のあるLiferayサービスを決定する必要があります。 http:// localhost:8080 / api / jsonwsで利用可能なサービスを見つけることができます。 このURLの http:// localhost:8080 をサーバーのアドレスに置き換えてください。

呼び出す必要があるサービスのインポートを追加します。 たとえば、ブログアプリを作成している場合、 BlogsEntryServiceインポートできます。

import com.liferay.mobile.android.v62.blogsentry.BlogsEntryService;

Liferayバージョン(.v62)がパッケージ名前空間で使用されていることに注意してください。 Mobile SDKは特定のLiferayバージョン用に構築されているため、異なるLiferayバージョンのサービスクラスはパッケージ名で区切られています。 この例では、Mobile SDKクラスは .v62 パッケージを使用していつまり、このMobile SDKはLiferay 6.2と互換性があります。 Liferay 7.0と互換性のあるモバイルSDKクラスは、 <code>v7 パッケージを使用します。 この名前空間により、アプリは複数のLiferayバージョンをサポートできます。

ステップ3:サービスオブジェクトを作成し、そのサービスメソッドを呼び出す

セッションと必要なインポートが完了したら、サービスを呼び出す準備が整います。 これは、呼び出したいサービスのサービスオブジェクトを作成し、そのサービスメソッドを呼び出すことで実行されます。 たとえば、ブログアプリを作成している場合、 BlogsEntryService を使用して、サイトからすべてのブログエントリを取得する必要があります。 これは、次のコードで示されています。

BlogsEntryService service = new BlogsEntryService(session);

JSONArray jsonArray = service.getGroupEntries(10184, 0, 0, -1, -1);

これにより、 ゲスト サイトからすべてのブログエントリが取得されます。 この例では、 ゲスト サイトの groupId10184です。 多くのサービスメソッドでは、パラメータとして groupId 必要であることに注意してください。 GroupServiceから getUserSites() メソッドを呼び出すことにより、ユーザーのグループを取得できます。

サービスメソッドの戻り型とすることができる ボイドJSONArray、又は JSONObject。 プリミティブ型ラッパーとすることができる ブール整数ロング、又は ダブル

この BlogsEntryService 呼び出しは、同期サービス呼び出しの基本的な例です。このメソッドは、リクエストが終了した後にのみ戻ります。 ただし、AndroidはアプリのメインUIスレッドからのネットワーク通信を許可しません。 メインUIスレッドから発行されるサービス呼び出しは非同期である必要があります。 これを行う方法については、チュートリアルを参照 Androidアプリから呼び出すサービスの非同期を

すばらしいです\! これで、Mobile SDKを介してLiferayサービスにアクセスする基本を理解できました。 ただし、アプリからサービスを呼び出すときに遭遇する可能性がある特別なケースがいくつかあります。これらについては、次のセクションで説明します。

非原始的議論

サービスメソッドの引数がプリミティブではない特別なケースがいくつかあります。 これらの場合、 JSONObjectWrapperを使用する必要があります。 たとえば、

JSONObjectWrapper wrapper = new JSONObjectWrapper(new JSONObject());

オブジェクトのプロパティとその値を含むJSONを渡す必要があります。 サーバー側では、オブジェクトがインスタンス化され、渡されたJSONの値を使用して各プロパティのセッターが呼び出されます。

サービスメソッドが引数としてインターフェイスまたは抽象クラスを必要とする他のケースがあります。 SDKが使用する実装を推測することは不可能であるため、クラス名で JSONObjectWrapper を初期化する必要があります。 たとえば、

JSONObjectWrapper wrapper = new JSONObjectWrapper(className, new JSONObject());

サーバーはクラスパスでクラス名を探し、オブジェクトをインスタンス化します。 次に、前の例のようにセッターを呼び出します。 抽象クラス OrderByComparator は、この良い例です。 これについて次に説明します。

OrderByComparator

サーバー側では、 OrderByComparator は抽象クラスです。 したがって、それを実装するクラスの名前を渡す必要があります。 たとえば、

String className = "com.liferay.portlet.bookmarks.util.comparator.EntryNameComparator";

JSONObjectWrapper orderByComparator = new JSONObjectWrapper(className, new JSONObject());

呼び出しているサービスがコンパレータ引数として null を受け入れる場合、 null をサービス呼び出しに渡します。

コンパレータの昇順プロパティを設定できます。 残念ながら、Liferay 6.2の時点で、ほとんどのLiferay OrderByComparator 実装にはこのプロパティのセッターがなく、Mobile SDKから設定することはできません。 Liferayの将来のバージョンではこれに対処する可能性があります。 ただし、昇順用のセッターを持つカスタム OrderByComparator があります。 この場合、次のコードを使用できます。

String className = "com.example.MyOrderByComparator";

JSONObject jsonObject = new JSONObject();
jsonObject.put("ascending", true);

JSONObjectWrapper orderByComparator = new JSONObjectWrapper(className, jsonObject);

その他の例については、テストケース OrderByComparatorTest.java参照してください。

ServiceContext

別の非プリミティブ引数は ServiceContextです。 Liferayのほとんどのサービス方法では、特別な注意が必要です。 ただし、SDKに渡す必要はありません。代わりに null を渡すことができます。 サーバーは、デフォルト値を使用して ServiceContext インスタンスを作成します。

ServiceContextプロパティを設定する必要がある場合は、新しい JSONObject 追加し、 ServiceContext 引数として渡すことで設定できます。

JSONObject jsonObject = new JSONObject();
jsonObject.put("addGroupPermissions", true);
jsonObject.put("addGuestPermissions", true);

JSONObjectWrapper serviceContext = new JSONObjectWrapper(jsonObject);

その他の例については、テストケース ServiceContextTest.java参照してください。

バイナリ

一部のLiferayサービスでは、バイト配列(byte [])やファイル(java.io.File)などの引数タイプが必要です。

Mobile SDKは、POST要求を送信する前にバイト配列を文字列に変換します。 たとえば、 "hello" .getBytes( "UTF-8")"[104,101,108,108,111]"ようなJSON配列になります。 Mobile SDKはこれを自動的に行うため、心配する必要はありません。メソッドにバイト配列を渡すだけです。

ただし、このような方法を使用する場合は注意が必要です。 これは、バイト配列全体にメモリを割り当てているためです。コンテンツが大きい場合、メモリの問題が発生する可能性があります。

他のLiferayサービスメソッドでは、引数として java.io.File 必要です。 これらの場合、Mobile SDKは代わりに InputStreamBody 必要とします。 これに対応するには、 InputStream を作成し、ファイルのMIMEタイプと名前とともに InputStreamBody コンストラクターに渡す必要があります。 たとえば、

InputStream is = context.getAssets().open("file.png");
InputStreamBody file = new InputStreamBody(is, "image/png", "file.png");

Mobile SDKは、マルチパートフォームリクエストをLiferayインスタンスに送信します。 サーバー側では、 File インスタンスが作成され、呼び出しているサービスメソッドに送信されます。

Liferayにデータをアップロードするサービスコールをキャンセルまたは監視することもできます。 データをアップロードするすべてのサービスは、 AsyncTask インスタンスを返します。 必要に応じて、これを使用してアップロードをキャンセルできます。 アップロードの進行状況をリッスンして進行状況バーを作成する場合は、 UploadProgressAsyncTaskCallback コールバックを作成し、現在の セッション オブジェクトに設定できます。 その onProgress メソッドは、送信されるバイトチャンクごとに呼び出されます。 これまでにアップロードされたバイトの総数を渡します。 たとえば、

session.setCallback(

    new UploadProgressAsyncTaskCallback<JSONObject>() {

        (...)

        public void onProgress(int totalBytes) {
            // This method will be called for each byte chunk sent.
            // The totalBytes argument will contain the total number
            // of uploaded bytes, from 0 to the total size of the
            // request.
        }

        (...)

    }
);

このテーマのその他の例については、 DLAppServiceTest.javaaddFileEntry * メソッドを参照してください。

ご覧のとおり、特別なサービスメソッドの引数が必要な場合でも、Mobile SDKは多くの作業を行います。

関連トピック

Androidアプリからのサービスの非同期呼び出し

モバイルSDKの構築

Mobile SDKを使用するiOSアプリの作成

« LiferayおよびカスタムポートレットサービスをAndroidアプリで利用可能にするAndroidアプリからのサービスの非同期呼び出し »
この記事は役に立ちましたか?
0人中0人がこの記事が役に立ったと言っています