.NET Core如何调用第三方Web API取数并自建对外接口?
问题解答
1. 能否在.NET Core中调用第三方Web API、使用API密钥获取数据?
完全可以,你当前代码中使用HttpClient调用第三方金价接口的逻辑方向是正确的。如果对方接口要求传入API密钥,只需要在发送请求前给HttpClient加上对应请求头即可,通常写法示例:
// 按照第三方接口要求的格式添加密钥,常见为Bearer认证或自定义头 client.DefaultRequestHeaders.Add("Authorization", "Bearer 你的API密钥"); // 或自定义头的情况 client.DefaultRequestHeaders.Add("X-API-Key", "你的API密钥");
2. 接口是否需要标注[HttpPost]特性?
是否加[HttpPost]完全取决于你自己的接口对外提供的请求方式,以及业务场景是否符合Post的使用规范:
- 你现有的
GetGoldPrice方法没有标注任何请求特性,默认支持Get请求,你的逻辑是只读查询金价列表,用Get完全符合规范,不需要加[HttpPost]。 - 你现有的
GetReservation方法虽然标注了[HttpPost],但逻辑是根据id查询单条数据,属于只读操作,用Get更符合REST设计规范,完全可以把[HttpPost]改成[HttpGet],只有当你需要传递大量参数、或者参数包含敏感信息不适合放在url中时,再考虑用Post。
3. 如何开发自己的API?
你当前写的是MVC控制器(继承Controller,返回的是视图View),如果要做纯Web API只返回数据的话,做几个小调整即可:
- 让控制器继承
ControllerBase,标注[ApiController]、[Route("[controller]/[action]")]这类路由特性 - 把返回值从
View(xxx)改成Ok(xxx),直接返回业务数据即可
示例调整后的代码框架:
[ApiController] [Route("api/[controller]")] public class GoldPriceDetailController : ControllerBase { // 建议通过注入获取HttpClient,不要手动new private readonly HttpClient _httpClient; public GoldPriceDetailController(IHttpClientFactory httpClientFactory) { _httpClient = httpClientFactory.CreateClient(); _httpClient.BaseAddress = new Uri("https://apigw.bank.com.tr:8003/"); _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); } [HttpGet] public async Task<IActionResult> GetGoldPrice() { List<GoldPrice> goldPriceList = new List<GoldPrice>(); HttpResponseMessage res = await _httpClient.GetAsync("getGoldPrices"); if (res.IsSuccessStatusCode) { // 不要用.Result,用await避免死锁 var objResponse = await res.Content.ReadAsStringAsync(); goldPriceList = JsonConvert.DeserializeObject<List<GoldPrice>>(objResponse); } return Ok(goldPriceList); } }
现有代码的注意点
- 不要每次请求都手动
new HttpClient,会导致套接字资源耗尽,建议用.NET Core自带的IHttpClientFactory注入获取实例,只需在Program.cs中注册builder.Services.AddHttpClient();即可使用。 GetReservation方法中的请求url拼接有误,当前写法"https://apigw.bank.com.tr:8443/getGoldPrices" + id会缺少分隔符,需要根据第三方接口的规则补上,比如getGoldPrices/{id}或者getGoldPrices?id={id}的格式。- 异步方法中不要用
.Result同步阻塞等待结果,统一用await,避免出现死锁问题。
内容的提问来源于stack exchange,提问作者Aysenur
相关产品推荐
相关产品推荐

