一尘不染

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

json

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

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

关键字:“ HelloWorld”

值:{“电子邮件”:“ 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)未找到。”


阅读 1274

收藏
2020-07-27

共1个答案

一尘不染

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

但是,作为答案,我将在此处分享一个简短的分步指南,介绍如何以Windows形式调用和使用Web API:

  1. 安装软件包 -安装Microsoft.AspNet.WebApi.ClientNuGet软件包(Web API客户端库)。

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

    Install-Package Microsoft.AspNet.WebApi.Client

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

  1. 设置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”));

  2. 发送请求 -要发送请求,可以使用以下方法HttpClient

    • GET: ,GetAsync,,GetStringAsync``GetByteArrayAsync``GetStreamAsync
    • POST: ,,PostAsync``PostAsJsonAsync``PostAsXmlAsync
    • PUT: ,,PutAsync``PutAsJsonAsync``PutAsXmlAsync
    • Delete: DeleteAsync
    • 另一个HTTP方法: Send

注意: 请记住,要为这些方法设置请求的URL,因为在定义时已指定了基本URL
client,则此处为这些方法设置了路径,路由值和查询字符串,例如:

    // 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);
  1. 得到回应

要获得响应,如果您使用了类似的方法GetStringAsync,那么您会将响应作为字符串使用,并且足以解析该响应。如果响应是您知道的Json内容,则可以轻松地使用package
JsonConvert类对其Newtonsoft.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是一种类型,只能创建一次然后共享。因此,不要在每次要使用它时都将其放在using块中。而是,创建类的实例并通过静态成员共享它。要了解有关此内容的更多信息,请查看不正确的实例化反模式

设计技巧

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