2017-01-12 13 views
0

ASP .NET Webサイトでは、.NETクライアントからWeb APIを呼び出す方法についてan exampleがあります。Web APIを正しく呼び出す方法

彼らは、新しい製品を作成する電話をかけるには、このメソッドを持っている:

static async Task<Uri> CreateProductAsync(Product product) 
{ 
    HttpResponseMessage response = await client.PostAsJsonAsync("api/products", product); 
    response.EnsureSuccessStatusCode(); 

    // Return the URI of the created resource. 
    return response.Headers.Location; 
} 

これは、任意の言語やフレームワークのいずれかのAPIへの呼び出しを行うための通常の方法のようですが、私はたくさんのを見ますこの行の問題:

"path"パラメータが文字列の場合、コンパイル時に発生する可能性のあるエラーを検出する方法はありません。また、APIが変更され、多くの呼び出しがあった場合は、すぐに呼び出しを再構築する方法はありません。

この種の問題を回避するための呼び出しを構築する方法はありますか?たとえば、私たちはWebサービスと同様に、

+0

短い答え:いいえ、それはHttpClientの設計方法です。 – Nkosi

+1

マジックストリングを使用する必要はありません。 configやデータベースなどにルートを保存すると、変更をすばやく行うことができますが、コンパイルエラーが発生してもそれは役に立ちません。 – Crowcoder

+0

ありがとうございます。しかし、あなたはどのようにパラメータを使用しますか?例えば、あなたが '' api/products/{Id} ''という経路を持っていてそれを別のクラスやデータベースに保存すると、'client.PutAsJsonAsync(Routes.Products、product) 'のような呼び出しがあります。非常に読みにくい。 –

答えて

2

Nkosiが言及したように、それはどのように設計されているかです。しかし、あなたはあなたのWEBAPIが変更された場合、あなたは簡単にパスを変更することができますこの方法をAPI URIの持つクラスを作成し、それらの代わりに、リテラル

public class ApiUris 
{ 
    public const string Products = "api/products"; 
    public const string Services = "api/services"; 
    public const string Orders = "api/orders"; 
    /* ... */ 
} 

を使用することができます。

+0

よく見えますが、ミスタイプのエラーや変更にはまだ敏感です。パラメータはどうですか?つまり、「api/products/getproduct/{ProductId}」を想像してみてください。これは、どのように設計されていれば、私にとってうまく設計されていないように見えます。 –

+0

あなたがデータベースやリソースファイルにあなたのURLを入れても、あなたはいつもミスタイプになりがちです...もちろん、あなたはuriをパラメータ化することができます。私はそれがどのように問題になるかわかりません。 dinamically uriを構築する方法を理解しようとしていますか? – Adam

+0

いいえ、私はWebServicesとWCFから来ています。そこで、あなたは 'client.Method(parameter)'を実行できます。 Web APIに何か良いものがあるかどうかは疑問だ。 –

-1

ちょうどあなたが

System.Web.Routing.RouteTable.Routes.ToList(); 

を使用して、ルートの一覧を取得することができアダムの解に延びる次にパスを得ることがRouteBase抽象クラスの具体的な実装に依存します。

+0

申し訳ありませんが、これが私の質問の答えとなるかどうかわかりません。 –

+0

私はあなたがfxに移入するためにこの方法を使うことができると考えていました。あなたのルートの静的クラスコンテナ何らかの種類のサービス契約を開発することができますが、再びSOAPに似ているREST-ishサービスにオーバーヘッドが発生しています。 – Thor

+0

生成された[ヘルプページ](https://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/creating-api-help-pages)を有効にすることは、私はしばしば見落とされます。 – Thor

0

WebサービスとWCFサービスでさえ、サーバーがURLのタイプやパラメータの構造を変更すると、ビルドに失敗します。あなたは、あなたがそのサービスに電話をかけて壊れたときにだけ、その変化を知るようになります。

Web APIを呼び出す場合は、APIを呼び出すまで、URLまたはパラメータメーターが間違っていることがわかりません。

同時に、Web APIは頻繁に変更されるようには構築されていません。彼らが信頼できない場合、誰もそれらを使用しません。したがって、APIを使用している場合は、URLを変更したり、特定の入力パラメータのサポートを一夜停止したりして、あなたのようなコンシューマアプリケーションを中断させないようにすることができます。彼らは確かに彼らの顧客によって訴えられることを望んでいません。

すべてのAPIは、徐々に変更され、顧客によく知らされているため、新しいバージョンのAPIをサポートするように実装を変更する時間があります。 あなたはあなたが使用しているサービスに頼り、それに関連する値(URLなど)を設定ファイルに入れるだけで十分です。あるいは、API Urlをデータベースに入れることで、変更時にデータベースのエントリを更新するだけで、変更がすぐに有効になるようにすることができます。

+0

あなたは「変更」問題にのみ焦点を当てています。しかし、クリーンコードやコーディングエラーはどうでしょうか? WebServiceでは、 'client.Method(parameters)'のようなメソッドを呼び出すことができます。それを見逃す方法はありません。また、Webサービスが変更された場合は、2回のクリックで説明を更新できます。 –

+0

クリーンコードは、「小さな値が変更されただけでプロジェクトを再コンパイルしないでください」です。それがコンフィギュレーションファイルが現れた時です。設定ファイルを変更して再デプロイするだけです。そしてあなたがデータベースにあなたの設定を入れたとしても再配置は避けられます。 –

+0

あなたがWebサービスについて言及したユースケースについては、これは正当なものですが、今は標準ではありません。あなたが求めているのは、すべてのWeb API世界でのユースケースではありません。 Web APIとの統合を開始するときは、すべてが正常に動作することを確認する必要があります。すべてのユースケースは、運用に移る前にカバーされています。 Web APIのPayLoadが正しくない場合にコンパイルに失敗したい場合は、これまで行われていないことです。 –