亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

ASP.NET - 模型對象列表的 API Url

ASP.NET - 模型對象列表的 API Url

C#
眼眸繁星 2023-09-24 16:06:21
目前我正在通過 jQuery 進行 API 調用,我的問題是,是否可以在 C# 中執行此調用,或者將 API 調用的結果轉換為 ASP.NET 模型對象列表?這是我的模型public class TeamStatsClass{        public int id { get; set; }        public string name { get; set; }        public string league { get; set; }        public string division { get; set; }}這是我當前的 ajax 調用$.ajax({        url: "https://statsapi.web.nhl.com/api/v1/teams?sportId=1",        success: function (data) {            for (var team of data.teams) {                console.log(team.name);            }        }    });更新我將我的課程更改為如下所示:public class StatsTeamsClass    {        public IEnumerable<Teams> teams { get; set; }        public string copyright { get; set; }    }    public class Division    {        public int id { get; set; }        public string name { get; set; }        public string link { get; set; }    }    public class Teams    {        public int id { get; set; }        public string name { get; set; }        public string link { get; set; }        public League league { get; set; }        public Division division { get; set; }    }并創建了這個方法,它確實將結果放入模型對象中:public async System.Threading.Tasks.Task<StatsTeamsClass> GetTeams(){            HttpClient Http = new HttpClient();            var json = await Http.GetStringAsync("https://statsapi.web.nhl.com/api/v1/teams?sportId=1");            StatsTeamsClass teams = JsonConvert.DeserializeObject<StatsTeamsClass>(json);            return teams;}但是當我嘗試在另一個控制器中調用這個方法時,它只是掛在那里,沒有錯誤,什么也沒有,我假設它會在一段時間后超時public class HomeController : Controller{        APIController webService = new APIController();        public ActionResult Index()        {            var item = webService.GetTeams().Result.teams;            return View();        }}(GetTeams() 位于控制器 APIController 內部)那么 A. 在對象模型中獲取 API 結果然后調用這些結果的正確方法是什么?
查看完整描述

3 回答

?
小怪獸愛吃肉

TA貢獻1852條經驗 獲得超1個贊

控制器操作也需要異步,以避免混合異步等待和阻塞調用,例如.Result.Wait()可能導致死鎖。


public class HomeController : Controller {? ??

? ? APIController webService = new APIController();


? ? public async Task<ActionResult> Index() {? ??

? ? ? ? var model = await webService.GetTeams();

? ? ? ? var teams = model.teams;

? ? ? ? return View();

? ? }

}

假設APIController是一個實際的ApiContoller


public class APIController : ApiController {


? ? //Your original code

? ? public async Task<StatsTeamsClass> GetTeams() {? ? ? ??

? ? ? ? HttpClient Http = new HttpClient();

? ? ? ? var json = await Http.GetStringAsync("https://statsapi.web.nhl.com/api/v1/teams?sportId=1");

? ? ? ? StatsTeamsClass teams = JsonConvert.DeserializeObject<StatsTeamsClass>(json);

? ? ? ? return teams;

? ? }


? ? //...

}

我建議不要APIController像這樣直接調用HomeController,而是將GetTeams()方法提取到可重用的服務中


public class WebService {

? ? static Lazy<HttpClient> http = new Lazy<HttpClient>();


? ? public async Task<T> GetAsync<T>(string url) {? ? ? ??

? ? ? ? var json = await http.Value.GetStringAsync(url);

? ? ? ? return JsonConvert.DeserializeObject<T>(json);

? ? }


? ? public Task<StatsTeamsClass> GetTeamsAsync() {? ? ? ??

? ? ? ? var url = "https://statsapi.web.nhl.com/api/v1/teams?sportId=1";

? ? ? ? return GetAsync<StatsTeamsClass>(url);

? ? }

}

參考您使用 HttpClient 錯誤


可以正確地用于HomeController


public class HomeController : Controller {? ? ? ??

? ? public async Task<ActionResult> Index() {

? ? ? ? // Ideally web service should be injected but that topic

? ? ? ? // is outside of the scope of the question at the moment.

? ? ? ? var webService = new WebService();


? ? ? ? var model = await webService.GetTeamsAsync();

? ? ? ? var teams = model.teams;


? ? ? ? //...


? ? ? ? return View(teams);

? ? }

}

這里的假設是該項目是一個混合的 Asp.Net MVC 和 Web Api 2+


索引.cshtml


@model IEnumerable<Teams>

@{

? ? ViewBag.Title = "Teams";

}

@if(Model != null && Model.Count() > 0) {

? ? @foreach (var @team in Model) {

? ? ? ? <p>@team.name</p>

? ? }

}


查看完整回答
反對 回復 2023-09-24
?
慕容708150

TA貢獻1831條經驗 獲得超4個贊

是的,C# 中的等效方法是使用HttpClient.?您最好創建一個類的靜態實例,以便為特定類型的重復調用重用:

private?static?readonly?HttpClient?Http?=?new?HttpClient();

然后通過async使用Newtonsoft.Json 的方法使用它,如下所示:

var?json?=?await?Http.GetStringAsync("https://statsapi.web.nhl.com/api/v1/teams?sportId=1");

然后,您可以將此 JSON 字符串解析為模型類,如下所示:

var?model?=?JsonConvert.DeserializeObject<TeamStatsClass>(json);


查看完整回答
反對 回復 2023-09-24
?
白衣染霜花

TA貢獻1796條經驗 獲得超10個贊

只是想在此處添加更多點您獲得的 json 無法直接轉換為 TeamStatsClass 您可能必須引入另一個基類,因為團隊是您獲得的 json 中的集合。


我將其發布在這里以獲得更清晰的視圖


? ? public class ResponseBaseClass

? ? {

? ? ? ? public IEnumerable<TeamStatsClass> teams { get; set; }

? ? ? ? public string copyright { get; set; }

? ? }

? ? public class TeamStatsClass

? ? {

? ? ? ? public int id { get; set; }

? ? ? ? public string name { get; set; }

? ? ? ? public Division division { get; set; }

? ? }

? ? public class Division

? ? {

? ? ? ? public int id { get; set; }

? ? ? ? public string name { get; set; }

? ? ? ? public string nameShort { get; set; }

? ? ? ? public string link { get; set; }


? ? }


?HttpClient Http = new HttpClient();

?var json = await Http.GetStringAsync("https://statsapi.web.nhl.com/api/v1/teams?sportId=1");

?var model = JsonConvert.DeserializeObject<ResponseBaseClass>(json);

?var yourTeamModelObj = model.teams;


查看完整回答
反對 回復 2023-09-24
  • 3 回答
  • 0 關注
  • 177 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號