چه تکنولوژی می‌خواهید یاد بگیرید؟

نظرات و انتقادات خود را با ما در میان بگذارید

آپدیت روزانه

بیش از 1000 پست آموزشی

نیازهای روز

فراخوانی توابع WEB API با استفاده از زبان سی شارپ

مطلب How to create a GET request from C# client به بررسی نحوه فراخوانی توابع WEB API پرداخته است. کدهای متشکل ذیل توابع WEB APIای است که در برنامه کنسول قصد داریم با استفاده از زبان برنامه نویسی سی شارپ آنها را فراخوانی نمایم. در این مثال سه تابع Get, GetAllPerson و GetLastName برای آشنایی بیشتر نحوه فراخوانی توابع WEB API در حالت مختلف تهیه شده است.

افزودن فضاء نام System.Net.Http جهت دستیابی به کلاس HttpClient الزامی است.

public class HomeController : ApiController
{
    private static IList<Person> personList = GetPersonList();

    private static IList<Person> GetPersonList()
    {
        return new List<Person>() 
        {
             new Person() { FirstName = "Vikram", LastName= "Chaudhary" },
             new Person() { FirstName = "Amit", LastName= "Kumar" },
             new Person() { FirstName = "Anoop", LastName= "Singh" }
        };
    }

    [Route("api/Home/Get")]
    [HttpGet]
    public HttpResponseMessage Get()
    {
        return Request.CreateResponse<string>(HttpStatusCode.OK, "Vikram");
    }

    [Route("api/Home/GetAllPerson")]
    [HttpGet]
    public HttpResponseMessage GetAllPerson()
    {
        return Request.CreateResponse<IList<Person>>(HttpStatusCode.OK, personList);
    }

    [Route("api/Home/GetLastName/{firstName}")]
    [HttpGet]
    public HttpResponseMessage GetLastName(string firstName)
    {
        if (personList.Where(item => item.FirstName.ToLower() == firstName).Count() > 0)
        {
            return Request.CreateResponse<Person>(HttpStatusCode.OK, personList.Where(item => item.FirstName.ToLower() == firstName).First());
        }
        else
        {
            return Request.CreateResponse<string>(HttpStatusCode.NotFound, "Person Not Found");
        }

    }
}

روش نخست فراخوانی تابع WEB API بدون ارسال پارامتر به صورت ذیل خواهد بود:

using (HttpClient client = new HttpClient())
{
    var response = client.GetAsync("http://localhost:52854/api/Home/GetAllPerson");
    if (response.Result.StatusCode == System.Net.HttpStatusCode.OK)
    {
        var result = response.Result.Content.ReadAsStringAsync();
        Console.WriteLine(result.Result);
    }
}

تصور نماید نیاز است کلیه اشخاص به صورت لیست ارائه شود، پس به منظور تبدیل رشته JSON به نوع دات نت از کتابخانه Newtonsoft که می‌توان از طریق ناگت به پروژه افزود استفاده نمود:

using (HttpClient client = new HttpClient())
{
    var response = client.GetAsync("http://localhost:52854/api/Home/GetAllPerson");
    if (response.Result.StatusCode == System.Net.HttpStatusCode.OK)
    {
        var result = response.Result.Content.ReadAsStringAsync();
        IList<Person> personList =
            (IList<Person>)Newtonsoft.Json.JsonConvert.DeserializeObject(result.Result, typeof(IList<Person>));
    }
}

همچنین به صورت زیر می‌توان پارامترهای به متد GetLastName ارسال نمود:

using (HttpClient client = new HttpClient())
{
    var response = client.GetAsync("http://localhost:52854/api/Home/GetLastName/vikram1");
    if (response.Result.StatusCode == System.Net.HttpStatusCode.OK)
    {
        var result = response.Result.Content.ReadAsStringAsync();
        Person personList = (Person)Newtonsoft.Json.JsonConvert.DeserializeObject(result.Result, typeof(Person));
    }
    else
    {
        var result = response.Result.Content.ReadAsStringAsync();
        Console.WriteLine(result.Result);
    }
}

مروری بر بدنه جنریک تابع الحاقی CreateResponse با اورلودهای مختلف. جهت دستیابی به این توابع می‌بایست به کلاس استاتیک HttpRequestMessageExtensions در فضاء نام System.Net.Http مراجعه کرد:

public static HttpResponseMessage CreateResponse<T>(this HttpRequestMessage request, T value)
{
    return request.CreateResponse<T>(HttpStatusCode.OK, value, (HttpConfiguration)null);
}
public static HttpResponseMessage CreateResponse<T>(this HttpRequestMessage request, HttpStatusCode statusCode, T value)
{
    return request.CreateResponse<T>(statusCode, value, (HttpConfiguration)null);
}
public static HttpResponseMessage CreateResponse<T>(this HttpRequestMessage request,
            HttpStatusCode statusCode, T value, HttpConfiguration configuration)
{
    if (request == null)
    {
        throw Error.ArgumentNull("request");
    }
    configuration = configuration ?? request.GetConfiguration();
    if (configuration == null)
    {
        throw Error.InvalidOperation(SRResources.HttpRequestMessageExtensions_NoConfiguration);
    }
    IContentNegotiator contentNegotiator = configuration.Services.GetContentNegotiator();
    if (contentNegotiator == null)
    {
        throw Error.InvalidOperation(SRResources.HttpRequestMessageExtensions_NoContentNegotiator, (object)typeof(IContentNegotiator).FullName);
    }
    IEnumerable<MediaTypeFormatter> formatters = (IEnumerable<MediaTypeFormatter>)configuration.Formatters;
    return NegotiatedContentResult<T>.Execute(statusCode, value, contentNegotiator, request, formatters);
}
public static HttpResponseMessage CreateResponse<T>(this HttpRequestMessage request,
            HttpStatusCode statusCode, T value, string mediaType)
{
    return request.CreateResponse<T>(statusCode, value, new MediaTypeHeaderValue(mediaType));
}
public static HttpResponseMessage CreateResponse<T>(this HttpRequestMessage request,
            HttpStatusCode statusCode, T value, MediaTypeHeaderValue mediaType)
{
    if (request == null)
        throw Error.ArgumentNull("request");
    if (mediaType == null)
        throw Error.ArgumentNull("mediaType");
    HttpConfiguration configuration = request.GetConfiguration();
    if (configuration == null)
        throw Error.InvalidOperation(SRResources.HttpRequestMessageExtensions_NoConfiguration);
    MediaTypeFormatter writer = configuration.Formatters.FindWriter(typeof(T), mediaType);
    if (writer == null)
        throw Error.InvalidOperation(SRResources.HttpRequestMessageExtensions_NoMatchingFormatter, new object[2]
        {
                    (object) mediaType,
                    (object) typeof (T).Name
        });
    return request.CreateResponse<T>(statusCode, value, writer, mediaType);
}
public static HttpResponseMessage CreateResponse<T>(this HttpRequestMessage request, 
            HttpStatusCode statusCode, T value, MediaTypeFormatter formatter)
        {
            return request.CreateResponse<T>(statusCode, value, formatter, (MediaTypeHeaderValue)null);
        }
public static HttpResponseMessage CreateResponse<T>(this HttpRequestMessage request,
            HttpStatusCode statusCode, T value, MediaTypeFormatter formatter, string mediaType)
{
    MediaTypeHeaderValue mediaType1 = mediaType != null
        ? new MediaTypeHeaderValue(mediaType)
        : (MediaTypeHeaderValue)null;
    return request.CreateResponse<T>(statusCode, value, formatter, mediaType1);
}
public static HttpResponseMessage CreateResponse<T>(this HttpRequestMessage request,
            HttpStatusCode statusCode, T value, MediaTypeFormatter formatter, MediaTypeHeaderValue mediaType)
{
    if (request == null)
        throw Error.ArgumentNull("request");
    if (formatter == null)
        throw Error.ArgumentNull("formatter");
    return FormattedContentResult<T>.Execute(statusCode, value, formatter, mediaType, request);
}



0 نظر:

تعداد دیدگاه‌های کاربران : 0 دیدگاه
مهمان گرامی! برای ارسال نظر نیاز است وارد سایت شوید.