9

Tridion2011SP1コアサービスに接続するためのAndroidアプリを開発しています。これまで、wsclientを使用してコアサービスwsdlからAndroidWSスタブを作成しました。

すべてのコアサービスメソッドへのアクセスを許可するスタブをインポートしました。

Androidアプリケーションを介してTridionに認証できるようになりましたが、などの最も基本的なWebサービス呼び出しを実行しようとするとgetApiVersion()、次のエラーが発生します。

ReflectionHelper * java.lang.NoSuchFieldException:GetApiVersionResult。

コアサービスと通信するJavaAndroidアプリを他の誰かが作成できたのだろうか?

興味深いことに、コードをJavaアプリケーションとして実行すると、wsimportスタブを使用するとすべてがうまく機能します。

助けていただければ幸いです。参考までに、コードスニペットを次に示します。

Tridionに接続するには:

class TridionConnect extends AsyncTask<String, Integer, String> { 
  // Called to initiate the background activity

  @Override
  protected String doInBackground(String... statuses) {  
    try {
      Authenticator.setDefault(new Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
          return new PasswordAuthentication("username", "password".toCharArray());
        }
      });

      url = new URL("http://tridion-server/webservices/CoreService2011.svc?wsdl");

      System.out.println(String.format("Get Service"));
      service = new CoreService2011();
      System.out.println(String.format("Get Client"));

      client = service.getBasicHttp();

      return "Authenticated To Tridion";
    } catch (Exception e) {
      Log.e("Authentication failure", e.toString());
      e.printStackTrace();
      return "Failed to authenticate";
    }
  }

  // Called when there's a status to be updated
  @Override
  protected void onProgressUpdate(Integer... values) {
    super.onProgressUpdate(values);
    // Not used in this case
  }

  // Called once the background activity has completed
  @Override
  protected void onPostExecute(String result) { // 
    Toast.makeText(FullscreenActivity.this, result, Toast.LENGTH_LONG).show();  
    area.setText("Authenticated to Tridion OK");
  }
}

ApiVersionを取得するには

client.getApiVersion();
UserData currentUser = client.getCurrentUser();
System.out.println(String.format("'%s' %s", currentUser.getTitle(), currentUser.getId()));
4

1 に答える 1

1

フランク、

それはいくつかの理由で不可能です。

wsimportを使用してコアサービスプロキシを作成する場合、JREに存在するjavaxライブラリが使用されます。ただし、Dalvikはjavaxライブラリのサブセットのみを実装しているため、Android環境ではこのアプローチは不可能です。

次に、プロキシを作成するためのKsoap2ツールを調べました。プロキシを作成したのと同じくらい、これは問題なく機能しているように見えましたが、コアサービスと一致しなかったため、認証できませんでした。JREプロキシvKsoap2プロキシを調べる以外に、このアプローチについてはこれ以上理解できませんでした。彼らはかなり異なっていました。

この時点で、私は一歩下がってお茶を飲み、アプローチを再設計しました。

Androidアプリとコアサービスの間に位置するac#RESTサービスを作成しました。

このアプローチは少し複雑に見えましたが、多くの利点があります。多くのスペード作業はRESTサービスで実行できます。これは、タブレットや電話の同様のコードよりもはるかに高速です。

次に、RESTサービスはCMS / CoreServiceと同じサーバー上にあるため、通信が高速になり、AndroidアプリからのRESTリクエストをはるかに軽くすることができます。

Tridionに対して認証し、パブリケーションを選択し、更新/保存/発行の準備ができた動的レイアウトでレンダリングされるコンポーネントを選択できるようになるまで、アプリケーションを取得しました。

このアプローチの大きな欠点の1つは、RESTサービスが「ステートレス」である必要があるため、表面的には、すべてのリクエストに対してコアサービスに対して認証する必要があることです。もちろん、私はそれをしませんが、Oauth、共有秘密などの代替アプローチを考え出す必要があります。

最初のテストでは、このアプローチはAndroidデバイスではかなり巧妙であるように見えました。

于 2013-01-19T12:03:26.773 に答える