0

プロジェクトからメディア タイプの応答を生成するためにWebApi.Halを使用しています。これは、 WebApi.Hal 2.6.0で概説されているように、次のナゲット パッケージ マネージャー コマンドを使用してプロジェクトにインストールされます。application/hal+jsonASP.Net Web API

インストール パッケージ WebApi.Hal

postman を使用してリクエストを作成し、次のレスポンスを受け取りました。

ここに画像の説明を入力

{
  "Id": 1,
  "Name": "blogEntryName",
  "StyleId": 1,
  "StyleName": "StylName",
  "_links": [],
  "_embedded": null
}

リンクは空になっています。リンクを取得するには?

Global.asax

protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            GlobalConfiguration.Configuration.Formatters.Add(new JsonHalMediaTypeFormatter());
            GlobalConfiguration.Configuration.Formatters.Add(new XmlHalMediaTypeFormatter());

        }

コントローラーとその他のクラス

public class ValuesController : ApiController
    {

        public ValuesController()
        {

        }

        // GET api/values
        public BlogEntryRepresentation Get()
        {

            List<int> reviewIds = new List<int>();
            reviewIds.Add(1);
            reviewIds.Add(2);
            reviewIds.Add(3);

            BlogEntryRepresentation beerRep = new BlogEntryRepresentation
            {
                Id = 1,
                Name = "blogEntryName",

                StyleId = 1,
                StyleName = "StylName",
                ReviewIds = reviewIds
            };

            return beerRep;

        }        

    }

        public class BlogCategory
        {
            protected BlogCategory()
            {
            }

            public int Id { get; protected set; }
            public string Name { get; set; }
        }

        public class BlogEntry
        {
            protected BlogEntry()
            {
            }

            public BlogEntry(string name)
            {
                Name = name;
            }

            public int Id { get; protected set; }
            public string Name { get; set; }
            public BlogCategory Style { get; set; }

        }

        public class BlogEntryRepresentation : Representation
        {
            public int Id { get; set; }
            public string Name { get; set; }


            public int? StyleId { get; set; }
            public string StyleName { get; set; }

            [JsonIgnore]
            public List<int> ReviewIds { get; set; }

            public override string Rel
            {
                get { return LinkTemplates.BlogEntries.BlogEntry.Rel; }
                set { }
            }

            public override string Href
            {
                get { return LinkTemplates.BlogEntries.BlogEntry.CreateLink(new { id = Id }).Href; }
                set { }
            }

            protected override void CreateHypermedia()
            {
                if (StyleId != null)
                    Links.Add(LinkTemplates.BlogCategories.Style.CreateLink(new { id = StyleId }));

                if (ReviewIds != null && ReviewIds.Count > 0)
                    foreach (var rid in ReviewIds)
                        Links.Add(LinkTemplates.Reviews.GetBeerReview.CreateLink(new { id = Id, rid }));
            }
        }

public static class LinkTemplates
    {

        public static class BlogCategories
        {
            public static Link GetStyles { get { return new Link("styles", "~/styles"); } }
            public static Link AssociatedBlogEntries { get { return new Link("blogEntries", "~/styles/{id}/blogEntries{?page}"); } }
            public static Link Style { get { return new Link("style", "~/styles/{id}"); } }
        }

        public static class BlogEntries
        {
            public static Link GetBlogEntries { get { return new Link("blogEntries", "~/blogEntries{?page}"); } }
            public static Link SearchBeers { get { return new Link("page", "~/blogEntries{?searchTerm,page}"); } }
            public static Link BlogEntry { get { return new Link("blogEntry", "~/blogEntries/{id}"); } }
        }

        public static class Reviews
        {
            public static Link GetBeerReview { get { return new Link("review", "~/blogEntries/{id}/reviews/{rid}"); } }
        }
}

参考文献

  1. ハイパーメディア向け NuGet パッケージ トップ 20
  2. 人気のある C# HAL プロジェクト
4

1 に答える 1