使用 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( 未找到"。
您可以查看以下文档教程:
- 从 .NET 客户端调用 Web API
但作为答案,在这里我将分享一个关于如何在 Windows 窗体中调用和使用 Web API 的快速而简短的分步指南:
-
安装包 - 安装
Microsoft.AspNet.WebApi.Client
NuGet 包(Web API 客户端库(。打开"工具"菜单 → NuGet 包管理器→包管理器控制台→ 在"包管理器控制台"窗口中,键入以下命令:
Install-Package Microsoft.AspNet.WebApi.Client
可以通过右键单击项目并选择"管理 NuGet 包"来安装包。
设置 HttpClient - 创建
HttpClient
的实例并设置其BaseAddress
和DefaultRequestHeaders
。例如:// 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"));
发送请求 - 要发送请求,您可以使用以下
HttpClient
方法:- 获取:
GetAsync
,GetStringAsync
,GetByteArrayAsync
,GetStreamAsync
- 帖子:
PostAsync
,PostAsJsonAsync
,PostAsXmlAsync
- 看跌:
PutAsync
,PutAsJsonAsync
,PutAsXmlAsync
- 删除:
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);
- 获取:
获取响应
要获取响应,如果您使用了
GetStringAsync
等方法,那么您将响应作为字符串,足以解析响应。如果响应是你知道的 Json 内容,你可以轻松地使用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;
如果您使用过
GetAsync
或PostAsJsonAsync
之类的方法,并且您有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
是一种需要创建一次然后共享的类型。因此,不要在每次要使用它时都尝试将其放在使用块中。相反,请创建类的实例并通过静态成员共享它。要阅读有关此内容的更多信息,请查看不正确的实例化反模式
设计提示
- 尽量避免将与 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进行交互。
此示例使用 HttpClient
和 JsonConvert
来获取或提交数据。这是一个非常快速的示例:
-
安装 Newtonsoft.Json nuget 包。并将以下 using 语句添加到表单中:
using System.Net.Http; using Newtonsoft.Json
-
在类级别定义 HttpClient 的实例:
private static HttpClient client = new HttpClient();
-
要发送 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 是一种更通用的方法,允许您获取状态代码。
-
要发送 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 的示例,请参阅我的另一篇文章。