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

4zcjmb1e  于 2023-01-17  发布在  C#
关注(0)|答案(5)|浏览(574)

我是一个初学者,正在创建winform应用程序。在这个应用程序中,我必须使用API进行简单的CRUD操作。我的客户已经与我共享了API,并要求以JSON格式发送数据。
API:http://blabla.com/blabla/api/login-valida
关键词:“你好世界”
值:{“电子邮件”:“user@gmail.com“,“密码”:“123456”、“时间”:“2015年9月22日10时15分20秒”}
响应:登录ID
我如何将数据转换为JSON,使用POST方法调用API并获得响应?

EDIT在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)页面未找到。

8yparm6h

8yparm6h1#

你可以看看下面的文档教程:

但作为答案,在这里我将分享一个快速和简短的一步一步的指南,关于如何调用和使用Windows窗体中的Web API:
1.安装软件包-安装Microsoft.AspNet.WebApi.Client NuGet软件包(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"));

*发送请求-要发送请求,可以使用HttpClient的以下方法:

  • 获取:x1米5英寸1x、x1米6英寸1x、x1米7英寸1x、x1米8英寸1x
  • 开机自检:x1个月9个月1个月、x1个月10个月1个月、x1个月11个月1个月
  • 放置:x1米12英寸1x、x1米13英寸1x、x1米14英寸1x
  • 删除: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内容,你可以很容易地使用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;

如果您使用了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块中。相反,创建该类的示例并通过静态成员共享它。要了解更多信息,请查看Improper Instantiation antipattern
    设计提示
  • 尽量避免将Web API相关代码与您的应用程序逻辑混合。例如,假设您有一个产品Web API服务。然后要使用它,首先定义一个IProductServieClient接口,然后将所有WEB API逻辑作为实现放入ProductWebAPIClientService中,您实现该接口以包含与WEB API交互的代码。您的应用程序应该依赖IProductServieClient。(SOLID原则,依赖倒置)。
wgxvkvu9

wgxvkvu92#

只需使用以下库。
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;
    }
wkftcu5l

wkftcu5l3#

ohfgkhjo

ohfgkhjo4#

验证码:

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);
svgewumm

svgewumm5#

下面是另一个使用在线REST服务(https://northwind.vercel.app)的示例,该服务允许与Northwind API交互。
此示例使用HttpClientJsonConvert获取或发送数据。下面是一个非常简单的示例:
1.安装Newtonsoft.Json nuget包,并在表单中添加以下using语句:

using System.Net.Http;
using Newtonsoft.Json

1.在类级别定义HttpClient的示例:

private static HttpClient client = new HttpClient();

1.发送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是一个更通用的方法,它还允许您获取状态代码。
1.要发送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的示例,请参阅我的其他帖子。

相关问题