猿教程 Logo

使用HttpClient调用Web API

.NET 2.0引入WebClient类,他的作用是使用HTTP协议与web服务器进行通信。但是,WebClient类有一些局限性。.NET 4.5中的HttpClient类解决了WebClient的一些限制。在这里,我们将在控制台应用程序中使用HttpClient类向IIS服务器中的Web API发送数据并接收返回数据。你可能在其他应用程序中使用过HttpClient。

让我们看一下如何在Web控制台应用程序使用HttpClient API。

我们将使用在前一节中创建的的Web API,如下。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
namespace MyWebAPI.Controller
{
    public class StudentController : ApiController
    {
        public IHttpActionResult GetAllStudents(bool includeAddress = false)
        {
            IList<StudentViewModel> students = null;
            using (var ctx = new SchoolDBEntities())
            {
                students = ctx.Students.Include("StudentAddress").Select(s => new StudentViewModel()
                {
                    Id = s.StudentID,
                    FirstName = s.FirstName,
                    LastName = s.LastName,
                    Address = s.StudentAddress == null || includeAddress == false ? null : new AddressViewModel()
                    {
                        StudentId = s.StudentAddress.StudentID,
                        Address1 = s.StudentAddress.Address1,
                        Address2 = s.StudentAddress.Address2,
                        City = s.StudentAddress.City,
                        State = s.StudentAddress.State
                    }
                }).ToList<StudentViewModel>();
            }
            if (students.Count == 0)
            {
                return NotFound();
            }
            return Ok(students);
        }
        public IHttpActionResult PostNewStudent(StudentViewModel student)
        {
            if (!ModelState.IsValid)
                return BadRequest("Not a valid data");
            using (var ctx = new SchoolDBEntities())
            {
                ctx.Students.Add(new Student()
                {
                    StudentID = student.Id,
                    FirstName = student.FirstName,
                    LastName = student.LastName
                });
                ctx.SaveChanges();
            }
            return Ok();
        }
        public IHttpActionResult Put(StudentViewModel student)
        {
            if (!ModelState.IsValid)
                return BadRequest("Not a valid data");
            using (var ctx = new SchoolDBEntities())
            {
                var existingStudent = ctx.Students.Where(s => s.StudentID == student.Id).FirstOrDefault<Student>();
                if (existingStudent != null)
                {
                    existingStudent.FirstName = student.FirstName;
                    existingStudent.LastName = student.LastName;
                    ctx.SaveChanges();
                }
                else
                {
                    return NotFound();
                }
            }
            return Ok();
        }
        public IHttpActionResult Delete(int id)
        {
            if (id <= 0)
                return BadRequest("Not a valid studet id");
            using (var ctx = new SchoolDBEntities())
            {
                var student = ctx.Students
                    .Where(s => s.StudentID == id)
                    .FirstOrDefault();
                ctx.Entry(student).State = System.Data.Entity.EntityState.Deleted;
                ctx.SaveChanges();
            }
            return Ok();
        }
    }
}

步骤1:

首先,在Visual Studio 2013中创建一个控制台应用程序。

步骤2:

打开NuGet包管理器控制台的工具- > NuGet包管理器- >包管理器控制台并执行下面的命令。

Install-Package Microsoft.AspNet.WebApi.Client

步骤3:

现在,创建一个Student 模型类,因为我们将向我们的Web API发送和接收Student对象。

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
}

HttpClient发送Get请求

下面的示例演示了向Web API发送一个HTTP GET请求并显示结果到控制台。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Http;
using System.Net.Http.Headers;
namespace HttpClientDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri("http://localhost:60464/api/");
                //HTTP GET
                var responseTask = client.GetAsync("student");
                responseTask.Wait();
                var result = responseTask.Result;
                if (result.IsSuccessStatusCode)
                {
                    var readTask = result.Content.ReadAsAsync<Student[]>();
                    readTask.Wait();
                    var students = readTask.Result;
                    foreach (var student in students)
                    {
                        Console.WriteLine(student.Name);
                    }
                }
            }
            Console.ReadLine();
        }        
    }
}

让我们逐步了解上面的例子。

首先,我们创建了一个HttpClient对象和分配了我们的Web API的地址。GetAsync()方法发送一个http GET请求到指定的url。GetAsync()方法是异步的,并返回一个Task。暂停执行,直到GetAsync Task.wait()()方法执行完成,并返回一个结果。

执行完成后,我们将从Task得到结果。结果类型是HttpResponseMessage。现在,您可以使用IsSuccessStatusCode检查http响应的状态。使用ReadAsAsync()方法读取结果的内容。

现在,您可以用这次方式使用HttpClient对象发送http GET请求并处理结果。


HttpClient发送Post请求

与发送Get请求类似,您也可以使用HttpClient的PostAsAsync()方法发送HTTP POST请求,处理返回结果的方式与Get相同。

下面的示例展示向Web API发送http POST请求。这将学生对象作为json数据发送Post请求到Web API并得到响应。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Http;
using System.Net.Http.Headers;
namespace HttpClientDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            var student = new Student() { Name = "Steve" };
            var postTask = client.PostAsJsonAsync<Student>("student", student);
            postTask.Wait();
            var result = postTask.Result;
            if (result.IsSuccessStatusCode)
            {
                var readTask = result.Content.ReadAsAsync<Student>();
                readTask.Wait();
                var insertedStudent = readTask.Result;
                Console.WriteLine("Student {0} inserted with id: {1}", insertedStudent.Name, insertedStudent.Id);
            }
            else
            {
                Console.WriteLine(result.StatusCode);
            }
        }
    }
}

下表列出了HttpClient所有的方法,他们可以用来发送不同类型的HTTP请求。

方法名称描述
GetAsync发送一个GET请求到指定的Uri,异步操作。
GetByteArrayAsync向指定的Uri发送一个GET请求,并将返回响应的数据作为一个字节数组,异步操作。
GetStreamAsync向指定的Uri发送一个GET请求,并返回响应的数据流,异步操作。
GetStringAsync向指定的Uri发送一个GET请求,并将返回响应的数据转换为Sting,异步操作。
PostAsync向指定的Uri发送一个POST请求,异步操作。
PostAsJsonAsync向指定的Uri发送一个Post请求,返回数据格式为json,异步操作。
PostAsXmlAsync向指定的Uri发送一个Post请求,返回数据格式为xml,异步操作。
PutAsync向指定的Uri发送一个Put请求,异步操作。
PutAsJsonAsync向指定的Uri发送一个Put请求,返回数据格式为json,异步操作。
PutAsXmlAsync向指定的Uri发送一个Put请求,返回数据格式为xml,异步操作。
DeleteAsync向指定的Uri发送一个Delete请求,异步操作。


访问MSDN了解HttpClient和HttpClientExtension的所有成员。


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/webapi/httpclient-consume-webapi.html