Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.1k views
in Technique[技术] by (71.8m points)

asp.net - Call and consume Web API in winform using C#.net

I am beginner and creating winform application. In which i have to use API for Simple CRUD operation. My client had shared API with me and asked to send data in form of JSON.

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

KEY : "HelloWorld"

Value : { "email": "user@gmail.com","password": "123456","time": "2015-09-22 10:15:20"}

Response : Login_id

How can i convert data to JSON, call API using POST method and get response?

EDIT Somewhere on stackoverflow i found this solution

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") + "}");
}

I got exception that says "The remote server returned an error: (404) Not Found."

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You can take a look at the following docs tutorial:

But as an answer, here I will share a quick and short a step by step guide about how to call and consume web API in Windows forms:

  1. Install Package - Install the Microsoft.AspNet.WebApi.Client NuGet package (Web API Client Libraries).

    Open Tools menu → NuGet Package Manager → Package Manager Console → In the Package Manager Console window, type the following command:

     Install-Package Microsoft.AspNet.WebApi.Client
    

    You can install package by right click on project and choosing Manage NuGet Packages as well.

  2. Set up HttpClient - Create an instance of HttpClient and set up its BaseAddress and DefaultRequestHeaders. For example:

     // 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. Send Request - To send the requests, you can use the following methods of the HttpClient:

    • GET: GetAsync, GetStringAsync, GetByteArrayAsync, GetStreamAsync
    • POST: PostAsync, PostAsJsonAsync, PostAsXmlAsync
    • PUT: PutAsync, PutAsJsonAsync, PutAsXmlAsync
    • DELETE: DeleteAsync
    • Another HTTP method: Send

    Note: To set the URL of the request for the methods, keep in mind, since you have specified the base URL when you defined the client, then here for these methods, just pass path, route values and query strings, for example:

     // Assuming http://localhost:4354/api/ as BaseAddress 
     var response = await client.GetAsync("products");
    

    or

     // 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. Get the Response

    To get the response, if you have used methods like GetStringAsync, then you have the response as string and it's enough to parse the response. If the response is a Json content which you know, you can easily use JsonConvert class of Newtonsoft.Json package to parse it. For example:

     // Assuming http://localhost:4354/api/ as BaseAddress 
     var response = await client.GetStringAsync("product");
     var data = JsonConvert.DeserializeObject<List<Product>>(response);
     this.productBindingSource.DataSource = data; 
    

    If you have used methods like GetAsync or PostAsJsonAsync and you have an HttpResponseMessage then you can use ReadAsAsync, ReadAsByteArrayAsync, ReadAsStreamAsync, `ReadAsStringAsync, for example:

     // 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;
    

Performance Tip

  • HttpClient is a type that is meant to be created once and then shared. So don't try to put it in a using block every time that you want to use it. Instead, create an instance of the class and share it through a static member. To read more about this, take a look at Improper Instantiation antipattern

Design Tip

  • Try to avoid mixing the Web API related code with your application logic. For example let's say you have a product Web API service. Then to use it, first define an IProductServieClient interface, then as an implementation put all the WEB API logic inside the ProductWebAPIClientService which you implement to contain codes to interact with WEB API. Your application should rely on IProductServieClient. (SOLID Principles, Dependency Inversion).

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...