我是初学者,正在创建 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:
安装包 - 安装
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
- POST:
PostAsync
、PostAsJsonAsync
、PostAsXmlAsync
- PUT:
PutAsync
、PutAsJsonAsync
、PutAsXmlAsync
- 删除:
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);
- 获取:
获取响应
要获取响应,如果您使用了类似
GetStringAsync
的方法,那么您将获得字符串形式的响应并且足以解析响应。如果响应是您知道的 Json 内容,您可以轻松使用Newtonsoft.Json
的JsonConvert
类包来解析它。例如:// 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
是一种旨在创建一次然后共享的类型。因此,不要在每次要使用它时都尝试将其放在 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/