.net C# - response.Content. ReadAsync< Result>无法正常工作,因为我认为它应该正常工作

gab6jxml  于 2022-12-30  发布在  .NET
关注(0)|答案(2)|浏览(138)

我正在开发一个winform应用程序,我正在对GoogleMaps API进行API调用,但由于某种原因,我无法得到响应,或者实际上,我确实得到了响应,但无法对其进行任何操作。
我的代码:

using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace GoogleMaps
{
    public partial class Main : Form
    {
        public Main()
        {
            InitializeComponent();

            setup().Wait();
        }

        static HttpClient client = new HttpClient();

        static async Task setup()
        {
            client.BaseAddress = new Uri("https://maps.googleapis.com/maps/api/geocode/json");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        }

        static async Task<Result> getAdress(int huisnummer, string postcode)
        {
            Result address = null;
            HttpResponseMessage response = await client.GetAsync($"?address=00+1234AB&key=MYKEY");
            if (response.IsSuccessStatusCode)
            {
                address = await response.Content.ReadAsAsync<Result>();
            }
            return address;
        }

        private async void BTN_submit_Click(object sender, EventArgs e)
        {
            Result address = new Result();

            address = await getAdress(31, "8256SC");

            richTextBox1.Text = "address is:" + address.formatted_address;
        }
    }
}

以及我的"将JSON粘贴为类"类:

namespace GoogleMaps
{

    public class Rootobject
    {
        public Result[] results { get; set; }
        public string status { get; set; }
    }

    public class Result
    {
        public Address_Components[] address_components { get; set; }
        public string formatted_address { get; set; }
        public Geometry geometry { get; set; }
        public string place_id { get; set; }
        public string[] types { get; set; }
    }

    public class Geometry
    {
        public Location location { get; set; }
        public string location_type { get; set; }
        public Viewport viewport { get; set; }
    }

    public class Location
    {
        public float lat { get; set; }
        public float lng { get; set; }
    }

    public class Viewport
    {
        public Northeast northeast { get; set; }
        public Southwest southwest { get; set; }
    }

    public class Northeast
    {
        public float lat { get; set; }
        public float lng { get; set; }
    }

    public class Southwest
    {
        public float lat { get; set; }
        public float lng { get; set; }
    }

    public class Address_Components
    {
        public string long_name { get; set; }
        public string short_name { get; set; }
        public string[] types { get; set; }
    }

}

我现在的输出什么都没有。但是我得到了一个200的响应。我该如何修复这个问题?

rjzwgtxy

rjzwgtxy1#

您正在反序列化到不正确的类。正确的类为Rootobject

address = await response.Content.ReadAsAsync<Rootobject>();

而不是使用Result

address = await response.Content.ReadAsAsync<Result>();

地理编码API响应示例(from Google API Docs):

{
    "results" : [
     {
         "address_components" : [
         {
            "long_name" : "1600",
            "short_name" : "1600",
            "types" : [ "street_number" ]
         }]
    ...            
    }],
   "status" : "OK"
}
svgewumm

svgewumm2#

HttpClient client = new HttpClient();
        client.BaseAddress = new Uri("https://fakestoreapi.com/products");
        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "");
        var response = client.GetAsync("products").Result;
        var root = response.Content.ReadAsAsync<IEnumerable<Root>>().Result;
        gridControl1.DataSource = root;

//具有API数据属性的根类作为模型

相关问题