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

标签 c# asp.net .net winforms asp.net-web-api

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

API:http://blabla.com/blabla/api/login-valida

关键:“ Hello World ”

值:{“电子邮件”:“user@gmail.com”,“密码”:“123456”,“时间”:“2015-09-22 10:15:20”

响应:Login_id

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

编辑 我在 stackoverflow 的某个地方找到了这个解决方案

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) 未找到。”

最佳答案

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

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

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

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

     Install-Package Microsoft.AspNet.WebApi.Client
    

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

  2. 设置 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"));
    
  3. 发送请求 - 要发送请求,您可以使用 HttpClient 的以下方法:

    • 获取:GetAsyncGetStringAsyncGetByteArrayAsyncGetStreamAsync
    • POST:PostAsyncPostAsJsonAsyncPostAsXmlAsync
    • PUT:PutAsyncPutAsJsonAsyncPutAsXmlAsync
    • 删除:DeleteAsync
    • 另一种 HTTP 方法:发送

    注意:要为方法设置请求的 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);
    
  4. 获取响应

    要获取响应,如果您使用了类似 GetStringAsync 的方法,那么您将获得字符串形式的响应并且足以解析响应。如果响应是您知道的 Json 内容,您可以轻松使用 Newtonsoft.JsonJsonConvert 类包来解析它。例如:

     // 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那么你可以使用 ReadAsAsync, ReadAsByteArrayAsync, ReadAsStreamAsync, `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是一种旨在创建一次然后共享的类型。因此,不要在每次要使用它时都尝试将其放在 using block 中。相反,创建类的实例并通过静态成员共享它。要了解更多相关信息,请查看 Improper Instantiation antipattern

设计提示

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

关于c# - 使用 C#.net 在 winform 中调用和使用 Web API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32716174/

相关文章:

c# - 初始隐藏的 asp.net 面板上的 JQuery 选项卡

asp.net - 如何使用 CICD 管道将带有 Linux 应用程序服务计划的 ASP .NET Core 应用程序部署到 azure?

asp.net - 不同div中的Grid View调整

c# - 更改基类属性 setter 行为

c# - 将工具窗口添加到现有 VS 扩展包 - 查找 ToolWindow 失败

c# - 如何在配置中指定颜色

c# - 如何返回通用 T.ToString()

c# - 为什么隐藏字段值没有发布在 mvc 4 中?

c# - Azure 长时间运行的外部 Web 服务调用

c# - Lockbits 跨越 1bpp 索引图像字节边界