如何使用Windows Form通过api获取数据

时间:2018-12-03 04:17:05

标签: c# winforms httpclient

在浏览器上,我可以获得这样的数据。(JSON格式) enter image description here

我想在WinForm上执行HTTP请求和get数据。如何使它像下面的图片一样?

enter image description here

我已经参考了一些相关信息。但是我很困惑如何开始(比如我应该在Form1.cs中编写代码或添加新类,如果我要创建模型……)

How to make HTTP POST web request

How to return async HttpClient responses back to WinForm?

我可以使用HttpClient方法吗?感谢您的回答和建议。


(新修改)

https://www.youtube.com/watch?v=PwH5sc-Q_Xk

我也从这段视频中学到了,但是我收到了错误消息。

  

没有MediaTypeFormatter可以从媒体类型为'text / html'的内容中读取类型为'IEnumerable`1的对象。

我的代码

Form1.cs

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Net.Http;
using System.Net.Http.Formatting;

namespace _123
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            HttpClient clint = new HttpClient();
            clint.BaseAddress = new Uri("http://localhost:8888/");
            HttpResponseMessage response = clint.GetAsync("PersonList").Result;

            var emp = response.Content.ReadAsAsync<IEnumerable<ImgList>>().Result;
            dataGridView1.DataSource = emp;
        }
    }
}

ImgList.cs(是这个模型吗?)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;

namespace _123
{
    class ImgList
    {
        public int id { get; set; }
        public string name { get; set; }
        public int age { get; set; }
    }
}

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:2)

  

在浏览器上,我可以获得这样的数据。(JSON格式)

这意味着您正在进行一个没有参数的HttpGet调用,正如我从Url中看到的那样,无论如何都没有HttpBody。对于HttpPost之类的其他调用,您必须使用Postman,Fiddler之类的工具

  

以下是使用C#进行Http Get调用的简单代码:

// Create HttpClient
var client = new HttpClient { BaseAddress = new Uri("http://localhost:8888/") };

// Assign default header (Json Serialization)
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(ApiConstant.JsonHeader));    

// Make an API call and receive HttpResponseMessage
var responseMessage = await client.GetAsync("PersonList", HttpCompletionOption.ResponseContentRead);

// Convert the HttpResponseMessage to string
var resultArray = await result.Content.ReadAsStringAsync();

// Deserialize the Json string into type using JsonConvert
var personList = JsonConvert.DeserializeObject<List<Person>>(resultArray);
  

工作原理

  • HttpClient是包含api服务地址的对象
  • 我们确保分配的标头是用于序列化/通信的Json类型
  • 发出异步Http Get呼叫
  • HttpResponseMessage用于提取字符串,使用NewtonSoft Json将其反序列化为List<Person>

请注意,Async调用方式应为Async

  

Person类的预期架构,以使用反序列化来填充List<Person>

public class Person
{
  public int id {get;set;}
  public string Name {get;set;}
  public int age {get;set;}
}
  

在哪里调用代码-Winform /添加新类

标准机制是创建一个通用的帮助程序库/类,从中完成所有API调用,获取结果,winform应该只进行数据绑定,而没有处理代码

答案 1 :(得分:-2)

使用Json并使用模型序列化数据。并为模型分配表单字段。