UWP/UAPアプリケーション内でASP.NET Core WebAPIを使用する方法を理解しようとしています。 WCFサービスを利用するのと同じようにWebAPIを利用することは可能だと思っていましたが、まだ何も見つかりません。
さらに、Microsoft.AspNet.WebApi.Coreをインストールしようとしましたが、UAP(バージョン= V10.0)と互換性がないため、成功しませんでした。
少し迷ってしまいました。たぶん、誰かが私にUWPアプリケーション内でWebApiを使用する方法のヒントを教えてくれるでしょう。
これは、API呼び出しを使用するのと同じです。 HttpClient
クラスを使用してエンドポイントを呼び出し、応答を処理するだけです。予想される動作に違いはありません。
次のように定義されたASP.NET Core Web APIエンドポイントがあるとします。
public class StackoverflowController : Controller
{
// I wanted to exemplify async capabilities.
// You'd use async/await for getting database values, etc.
[
HttpGet,
AllowAnonymous,
Route("api/greeting")
]
public Task<GreetingResult> Greeting() =>
Task.FromResult(new GreetingResult { Message = "Hello world!" });
}
public class GreetingResult
{
public string Message { get; set; }
}
これが「localhost:5000」でホストされていると仮定すると、次のことができます。
public class Consumer
{
public async Task<string> GetGreetingAsync()
{
using (var client = new HttpClient())
{
var response =
await client.GetStringAsync("http://localhost:5000/api/greeting");
// The response object is a string that looks like this:
// "{ message: 'Hello world!' }"
}
}
}
さらに、厳密に型指定されたオブジェクトがNewtonsoft.Json
を使用するため、これを逆シリアル化できます。私のUWPアプリがまさにこれを行う例があります ここ 。
さらに情報を追加します。
UWPでWeb APIを使用する最良の方法は、前述のようにHttpClientを使用することです。
ここに私が役立つと思ういくつかの例があります。
Web APIレベルで実行できるすべての操作を収集できるMobileServiceClientクラスを作成することをお勧めします。
public class MobileServiceClient
{
//access token if you use authentication:
private string _accessToken;
//address of your Web Api:
private string _serviceAddress;
//Constructor:
public MobileServiceClient(string accessToken, string serviceAddress)
{
_accessToken = accessToken;
_serviceAddress = serviceAddress;
}
//Now you can implement methods that you will invoke to perform selected operation related with Web Api:
#region Methods
//You can perform "Get" to retrieve object from the Web Api and then deserialize it (using Json .NET):
public async Task<SampleClass> GetSampleClass()
{
SampleClass sampleClass= null;
try
{
using (HttpClient client = new HttpClient())
{
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + _accessToken);
var data = await client.GetAsync(string.Concat(_serviceAddress, "routeName"));
var jsonResponse = await data.Content.ReadAsStringAsync();
if (jsonResponse != null)
sampleClass= JsonConvert.DeserializeObject<SampleClass>(jsonResponse);
return sampleClass;
}
}
catch (WebException exception)
{
throw new WebException("An error has occurred while calling GetSampleClass method: " + exception.Message);
}
}
//You can perform "Get" to retrieve list of objects and then deserialize it:
public async Task<List<SampleClass>> GetSampleClassObjects()
{
List<SampleClass> SampleClassObjectsList = null;
try
{
using (HttpClient client = new HttpClient())
{
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + _accessToken);
var data = await client.GetAsync(string.Concat(_serviceAddress, "routeName"));
var jsonResponse = await data.Content.ReadAsStringAsync();
if (jsonResponse != null)
SampleClassObjectsList = JsonConvert.DeserializeObject<List<SampleClass>>(jsonResponse);
return SampleClassObjectsList;
}
}
catch (WebException exception)
{
throw new WebException("An error has occurred while calling GetSampleClassObjects method: " + exception.Message);
}
}
//You can also "Post" some object:
public async Task<bool> PostSomeObject(SampleClass sampleClassObject)
{
try
{
using (HttpClient client = new HttpClient())
{
var sampleClassObjectJson = JsonConvert.SerializeObject(sampleClassObject);
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + _accessToken);
var content = new StringContent(sampleClassObjectJson, Encoding.UTF8, "application/json");
HttpResponseMessage response = await client.PostAsync(string.Concat(_serviceAddress + "routeName"), content);
if (response.StatusCode == HttpStatusCode.OK)
return true;
else
throw new WebException("An error has occurred while calling PostSomeObject method: " + response.Content);
}
}
catch (WebException exception)
{
throw new WebException("An error has occurred while calling PostFeedback method: " + exception.Message);
}
}
#endregion
}
このような実装では、たとえば他のプラットフォーム(Xamarin AndroidまたはiOSなど)をサポートすることを決定した場合、将来コードを共有できることに注意してください。これがあなたの助けになることを願っています。
David Pinesの回答は、すべてを手動で実行したい場合、またはSwaggerを使用しない場合に十分です。
Swagger(つまり Swashbuckle Swagger 6. for ASP.NET Core)を使用してRESTful APIを記述し、そのドキュメントを生成する場合、swagger定義ファイル(swagger.json)を使用してRestクライアントを生成できます。 。そのようなツールの1つは、Azureチームによって作成された AutoRest です。また、DotNetを既にサポートしている Microsoft.Rest.ClientRuntime も必要です。
ASP.NET Core RTM=で動作するかどうかはまだわかりませんが、以前のバージョンのサポートとそれに統合されたベータ版を示す問題が解決またはクローズされました。
NuGetパッケージリンク