使我自己的API能够从另一个API请求

时间:2019-03-25 15:39:05

标签: c# asp.net json api

我有一个现有的并且可以正常运行的API,现在必须能够从另一个外部API获取数据。我如何做到最好?

我尝试使用HTTPClient,但是我似乎无法使其正常工作。我得到的错误:

“没有MediaTypeFormatter可以从媒体类型为'text / html'的内容中读取类型为'IList`1'的对象。” ->我在第37行收到此错误。考虑到我想要的只是数据(来自外部API),而不是使用视图显示它,因为这是一个API,因此可以发现它和/或告诉我如何以不同的方式执行此操作?

下面的代码。我还创建了一个Pastebin:https://pastebin.com/MuKjEVys

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Net;

namespace API.Controllers
{
[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/[controller]")]
[ApiController]
public class ExternalApiController : Controller
{
    private string ExternalApiLink = "https://blablabla.com/api";
    private string ExternalApiLinkGet = "/module/1/";
    [HttpGet("getdata")]
    public ActionResult<ExternalApi> GetDataFromExternal()
    {

        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri(ExternalApiLink);

            var requestApi = client.GetAsync(ExternalApiLinkGet);
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "XXXX");
            requestApi.Wait();

            var resultFromApi = requestApi.Result;

            if (resultFromApi.IsSuccessStatusCode)
            {
                var readResponse = resultFromApi.Content.ReadAsAsync<IList<ExternalApi>>();
                readResponse.Wait();

                var data = readResponse.Result;

                return Json(data);
            }else
            {
                return NotFound();
            }
        }
    }
}

}

1 个答案:

答案 0 :(得分:0)

您的响应内容似乎是json,而内容类型是text / html。如果是这种情况,那么第一件事就是打电话给要公开该服务的一方,并要求他们进行修复。同时,您可以将响应的内容作为字符串读取,然后反序列化该字符串:

// Note that I made this method async.
public async Task<IActionResult> GetDataFromExternal()
{
    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri(ExternalApiLink);

        // note that I moved this line above the GetAsync method.
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "XXXX");

        // note that I'm disposing the response
        using (var response = await client.GetAsync(ExternalApiLinkGet))
        {
            if (response.IsSuccessStatusCode)
            {
                // Since the response content is json, but the content-type
                // is text/html, simply read the content as a string.
                string content = await response.ReadAsStringAsync();

                // You can return the actual received content like below,
                // or you may deserialize the content before returning to make
                // sure it is correct, using JsonConvert.DeserializeObject<List<ExternalApi>>()
                // var data = JsonConvert.DeserializeObject<List<ExternalApi>>(content);
                // return Json(data);
                return Content(content, "application/json");
            }
            else
            {
                return NotFound();
            }
        }
    }
}