使用 C#.net 在 winform 中调用和使用 Web API

本文关键字:Web API 调用 net winform 使用 | 更新日期: 2023-09-27 18:13:59

我是初学者,正在创建wform应用程序。其中我必须使用 API 进行简单的 CRUD 操作。我的客户与我共享了API,并要求以JSON的形式发送数据。

原料药 : http://blabla.com/blabla/api/login-valida

KEY : "HelloWorld">

值 : { "电子邮件": "user@gmail.com","密码": ">

123456","时间": "2015-09-22 10:15:20"}

响应 : Login_id

如何将数据转换为 JSON,使用 POST 方法调用 API 并获得响应?

编辑在堆栈溢出的某个地方,我找到了这个解决方案

public static void POST(string url, string jsonContent)
{
    url="blabla.com/api/blala" + url;
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(baseURL);
    request.Method = "POST";
    System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
    Byte[] byteArray = encoding.GetBytes(jsonContent);
    request.ContentLength = byteArray.Length;
    request.ContentType = @"application/json";
    using (Stream dataStream = request.GetRequestStream())
    {
        dataStream.Write(byteArray, 0, byteArray.Length);
    }
    long length = 0;
    try
    {
        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
        {
            length = response.ContentLength;
            
        }
    }
    catch
    {
        throw;
    }
}
//on my login button click 
private void btnLogin_Click(object sender, EventArgs e)
{
    CallAPI.POST("login-validate", "{ '"email'":" + txtUserName.Text + " ,'"password'":" + txtPassword.Text + ",'"time'": " + DateTime.Now.ToString("yyyy-MM-dd h:mm tt") + "}");
}

我收到异常,显示"远程服务器返回错误:(404( 未找到"。

使用 C#.net 在 winform 中调用和使用 Web API

您可以查看以下文档教程:

  • 从 .NET 客户端调用 Web API

但作为答案,在这里我将分享一个关于如何在 Windows 窗体中调用和使用 Web API 的快速而简短的分步指南:

  1. 安装包 - 安装 Microsoft.AspNet.WebApi.Client NuGet 包(Web API 客户端库(。

    打开"工具"菜单 → NuGet 包管理器→包管理器控制台→ 在"包管理器控制台"窗口中,键入以下命令:

     Install-Package Microsoft.AspNet.WebApi.Client
    

    可以通过右键单击项目并选择"管理 NuGet 包"来安装包。

  2. 设置
  3. HttpClient - 创建 HttpClient 的实例并设置其BaseAddressDefaultRequestHeaders。例如:

     // In the class
     static HttpClient client = new HttpClient();
     // Put the following code where you want to initialize the class
     // It can be the static constructor or a one-time initializer
     client.BaseAddress = new Uri("http://localhost:4354/api/");
     client.DefaultRequestHeaders.Accept.Clear();
     client.DefaultRequestHeaders.Accept.Add(
         new MediaTypeWithQualityHeaderValue("application/json"));
    
  4. 发送请求 - 要发送请求,您可以使用以下HttpClient方法:

    • 获取: GetAsyncGetStringAsyncGetByteArrayAsyncGetStreamAsync
    • 帖子: PostAsyncPostAsJsonAsyncPostAsXmlAsync
    • 看跌: PutAsyncPutAsJsonAsyncPutAsXmlAsync
    • 删除:DeleteAsync
    • 另一种HTTP方法:Send

    注意:要为方法设置请求的URL,请记住,由于您在定义client时指定了基本URL,那么对于这些方法,只需传递路径,路由值和查询字符串,例如:

     // Assuming http://localhost:4354/api/ as BaseAddress 
     var response = await client.GetAsync("products");
    

     // Assuming http://localhost:4354/api/ as BaseAddress 
     var product = new Product() { Name = "P1", Price = 100, Category = "C1" };
     var response = await client.PostAsJsonAsync("products", product);
    
  5. 获取响应

    要获取响应,如果您使用了 GetStringAsync 等方法,那么您将响应作为字符串,足以解析响应。如果响应是你知道的 Json 内容,你可以轻松地使用JsonConvertNewtonsoft.Json包来解析它。例如:

     // Assuming http://localhost:4354/api/ as BaseAddress 
     var response = await client.GetStringAsync("product");
     var data = JsonConvert.DeserializeObject<List<Product>>(response);
     this.productBindingSource.DataSource = data; 
    

    如果您使用过GetAsyncPostAsJsonAsync之类的方法,并且您有HttpResponseMessage那么您可以使用ReadAsAsyncReadAsByteArrayAsyncReadAsStreamAsync,'ReadAsStringAsync,例如:

     // Assuming http://localhost:4354/api/ as BaseAddress 
     var response = await client.GetAsync("products");
     var data = await response.Content.ReadAsAsync<IEnumerable<Product>>();
     this.productBindingSource.DataSource = data;
    

性能提示

  • HttpClient是一种需要创建一次然后共享的类型。因此,不要在每次要使用它时都尝试将其放在使用块中。相反,请创建类的实例并通过静态成员共享它。要阅读有关此内容的更多信息,请查看不正确的实例化反模式

设计提示

  • 尽量避免将与 Web API 相关的代码与应用程序逻辑混合。例如,假设您有一个产品 Web API 服务。然后要使用它,首先定义一个IProductServieClient接口,然后作为实现将所有 WEB API 逻辑放入您实现的ProductWebAPIClientService中,以包含与 WEB API 交互的代码。您的应用程序应依赖于 IProductServieClient 。(坚实的原则,依赖反转(。

只需使用以下库。

https://www.nuget.org/packages/RestSharp

GitHub 项目:https://github.com/restsharp/RestSharp

示例代码:

    public Customer GetCustomerDetailsByCustomerId(int id)
    {
        var client = new RestClient("http://localhost:3000/Api/GetCustomerDetailsByCustomerId/" + id);
        var request = new RestRequest(Method.GET);
        request.AddHeader("X-Token-Key", "dsds-sdsdsds-swrwerfd-dfdfd");
        IRestResponse response = client.Execute(request);
        var content = response.Content; // raw content as string
        dynamic json = JsonConvert.DeserializeObject(content);
        JObject customerObjJson = json.CustomerObj;
        var customerObj = customerObjJson.ToObject<Customer>();
        return customerObj;
    }
  • 使用 Json.Net 将数据转换为 JSON
  • 使用网络客户端发布数据

使用以下代码:

var client = new HttpClient();
client.BaseAddress = new Uri("http://www.mywebsite.com");
var request = new HttpRequestMessage(HttpMethod.Post, "/path/to/post/to");
 
var keyValues = new List<KeyValuePair<string, string>>();
keyValues.Add(new KeyValuePair<string, string>("site", "http://www.google.com"));
keyValues.Add(new KeyValuePair<string, string>("content", "This is some content"));
 
request.Content = new FormUrlEncodedContent(keyValues);
var response = await client.SendAsync(request);

这是另一个使用在线REST服务(https://northwind.vercel.app(的示例,该服务允许与罗斯文API进行交互。

此示例使用 HttpClientJsonConvert 来获取或提交数据。这是一个非常快速的示例:

  1. 安装 Newtonsoft.Json nuget 包。并将以下 using 语句添加到表单中:

    using System.Net.Http;
    using Newtonsoft.Json
    
  2. 在类级别定义 HttpClient 的实例:

    private static HttpClient client = new HttpClient();
    
  3. 要发送 GET 请求,例如获取所有数据的列表:

    var url = "https://northwind.vercel.app/api/categories";
    var response = await client.GetAsync(url);
    if (response.StatusCode == System.Net.HttpStatusCode.OK)
    {
        var content = await response.Content.ReadAsStringAsync();
        var categories = JsonConvert.DeserializeObject<List<Category>>(content);
        dataGridView1.DataSource = categories;
    }
    

    您还可以使用 Get 的其他重载,如 GetStringAsync、GetStreamAsync 等。但是 GetAsync 是一种更通用的方法,允许您获取状态代码。

  4. 要发送 POST 请求,例如发布新数据,请执行以下操作:

    var url = "https://northwind.vercel.app/api/categories";
    var data = new Category() { Name = "Lorem", Description = "Ipsum" };
    var jsonData = Newtonsoft.Json.JsonConvert.SerializeObject(data);
    var requestContent = new StringContent(jsonData, Encoding.Unicode, "application/json");
    var response = await client.PostAsync(url, requestContent);
    if (response.StatusCode == System.Net.HttpStatusCode.Created)
    {
        var content = await response.Content.ReadAsStringAsync();
        var createdCategory = JsonConvert.DeserializeObject<Category>(content);
        MessageBox.Show(createdCategory.Id.ToString())
    }
    

要了解更多信息并查看一些最佳实践或查看没有 JsonConvert 的示例,请参阅我的另一篇文章。