2012-06-27 18 views
14

私は物流上の疑問があります。アプリとの同期が外れるAPIを管理するための最良の方法を見つけようとしています。これを説明する最善の方法は、例です:iOSクライアント/サーバーアプリでアップデートを管理する最善の方法

MyAppバージョン1.0がfirst_name、last_name、およびemailを必要とする「submit_feedbacK」APIに投稿されたとします。

次に、MyAppバージョン2.0をApp Storeに送信します。このバージョンは、first_name、last_name、gender、およびemailをAPIに投稿するように設計されています。これらはすべてAPIの必須フィールドです。

私が持っている問題: - 新しいアプリケーションが実稼働中である前に、私はAPIを更新した場合、それはバージョン1.0 を中断します - バージョン2.0が1.0に不自由リモートでのライブとなるまで、私は待っていれば、私はそれを正しく時間を計る必要があります。

私は、「正しい答え」は2つの異なるAPIを維持することだと推測します。しかし、両方のAPIが同じライブ・データベースにポストすると、状況が少し面倒になります。

これをモデル化する方法の提案はありますか?

+2

私は一般的な考え方はAPIとデータベース構造を設計しようと考えています。それはしばらくの間、変化を壊す必要はなく、厄介さの正味の合計を最小限に抑えるでしょう。 'gender'の値が1.0の生涯にわたって絶対に必要でない場合は、バージョンの移行中にまだ更新していないユーザーでなくても、それを実行することができます。 – millimoose

+0

これは本当です。値が提供されない場合、レガシーアプリケーションはそれを提供しないため、新しいフィールドはデフォルトで "male"に設定されます。私は、コンセプトに再接近する必要があるかのように、私は複雑な変化をより心配していると思います。しかし、あなたが言ったように、大きな変化が稀に残されている場合、残りはおそらくダウンタイムアナウンスを通じて対処することができます。また、アプリの公開時期を選択できるようになったので、アップデートの管理に役立ちます。とにかく、フィードバックのおかげで! – Anthony

答えて

7

この質問は、いくつかの側面をiOS consuming API designと共有する場合があります。

正しい答えは、2つのAPIを提供することです(少なくともユーザーが調整している間は短期間)。同時に2つのバージョンを管理する必要はありません。新しいバージョンがリリースされたら、そのバージョンを維持して、古いバージョンの古いバージョンを提供するだけです。あなたがそれに加えなければならない本当の変更は、セキュリティパッチや主要な問題のようなものだけです。主な変更(データベース全体を再構成することを決定した場合など)は、以前のバージョンが動作しなくなる可能性がありますが、新しいAPIバージョンへの更新は、以前のバージョンが機能するように設計する必要があります。

もう1つの質問は、さまざまなバージョンのアプリに正しいバージョンのAPIをアクセスさせる方法についての回答です。

もう1つ注意する点は、使用しているフレームワークによっては、APIをエンジンやサブアプリケーションとして設計し、別のエンドポイントにマウントする方が簡単かもしれないということです。私はこれがRailsでEnginesを使うことで簡単にでき、Node with Expressでapp.use()をサブアプリケーションで使うことができることを知っています。

+0

codeigniterでこれを行う方法を知っていますか?私は各apiバージョンに古いバージョンを拡張し、必要なものだけを変更させることを考えていました。 –

+0

いいえ、私はしません。私はCodeIgniterを使用していませんが、Googleはこれにあなたの友人かもしれません。 –

0

あなたのアプリとのコミュニケーションにwebservice/httpエンドポイントを使用します。アプリのすべてのバージョンで同じURLを維持することをご希望の場合は、サーバーへのすべてのリクエスト/投稿にバージョン番号を含めて、それらを処理する方法を知ってください。これにより、新しいバージョンがサーバー上の新しいAPIに対してテストできるようになり、開発とテストが容易になります。

したがって、webservice/serverを呼び出すことができる関数であれば、バージョン番号の変数を1つ追加してください。同じ関数の256バージョン(いつも)を打つと、最初からやり直すことができると思うので、BYTEは十分であるはずです。

サーバーでデータのリクエスト/投稿が受信されると、サーバーAPIに単純なスイッチ/ケース構造をコーディングするだけで、両方のバージョンでサポートが機能するようになります。

もしそれらが似ているが、例えば。パラメタまたは何かを交換すると、これらすべてのサーバーサイドを処理でき、ソリューションのサーバー部分でBAL/DAL(n層構造)を維持できます。

Btw。私の答えはiOSやスマートデバイスだけではなく、開発中および保守中にすべてがオンラインでなければならない "作業中の"生産セットアップのクライアント/サーバーアプローチです。

希望する場合は、それ以外の場合は、コメントしてください、それをさらに説明しようとします。

0

私はCodeIgniterを使用しています。私はhttps://github.com/philsturgeon/codeigniter-restserverで提供されているRESTコントローラを使用しています。私は最終的にすべてのバージョンで異なるエンドポイントを持つことになった。基本的には、各リリースの新しいリポジトリをチェックアウトし、それを一意のディレクトリに入れます。 (つまり、http://www.mysite.com/1.0/api/methodhttp://www.mysite.com/1.1/api/methodなど)複数のバージョンのAPIを1つのコードベースで維持しようとすると、恐ろしい響きになりました。少なくとも私がバージョンをリリースしたとき、私はそれが石で固定されていることを知っていて、それを壊すことを心配する必要はありません。 (注:同じドメインから複数のCodeIgniterインスタンスを実行するには、特殊な.htaccessを微調整する必要がありました)。

+0

あなたはバージョン(例えば2.0)をリリースすると、2.0を2.1の新しいレポに効果的にフォークすると言っていますか?このアプローチでは、サブアプリケーション/エンジン –

+0

と同様の最終結果が得られます。私は1つの大きなコードベースとしてそれを維持しようと考えたが、私が提起した質問は:私はこのAPIの100バージョン(1.0.0,1.0.1,1.0.2,1.0.0など)がある場合、 1つの巨大なコードベースにこれらのバージョンをすべて入れたいのですか?簡単な答えはノーで、それは悪夢になるだろう。各APIをフォークして、それを取り除くだけで良いので、それを心配する必要はありません。意図的に無効にして人々に最新のアプリに移行させない限り、各アプリのリリースは独自のAPIを指し示すことができ、先行バージョンや将来のバージョンについては心配する必要はありません。 – Anthony

+0

データベースのバージョニングはまだ問題ですが、DBの変更のほとんどすべてで列が追加されています。私がすでにやったことの構造はあまり変わっていません。その場合、「user_v2」のような新しいタイプのモデルを変更し、古いデータを新しい構造に移行することを検討する必要があります。 Anywho、それは私のアプローチでした。 – Anthony

関連する問題