通过NET客户端调用Web APIC#.docx

上传人:b****5 文档编号:7428790 上传时间:2023-01-23 格式:DOCX 页数:13 大小:239.07KB
下载 相关 举报
通过NET客户端调用Web APIC#.docx_第1页
第1页 / 共13页
通过NET客户端调用Web APIC#.docx_第2页
第2页 / 共13页
通过NET客户端调用Web APIC#.docx_第3页
第3页 / 共13页
通过NET客户端调用Web APIC#.docx_第4页
第4页 / 共13页
通过NET客户端调用Web APIC#.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

通过NET客户端调用Web APIC#.docx

《通过NET客户端调用Web APIC#.docx》由会员分享,可在线阅读,更多相关《通过NET客户端调用Web APIC#.docx(13页珍藏版)》请在冰豆网上搜索。

通过NET客户端调用Web APIC#.docx

通过NET客户端调用WebAPIC#

【ASP.NETWebAPI教程】3.2通过.NET客户端调用WebAPI(C#)

注:

本文是【ASP.NETWebAPI系列教程】的一部分,如果您是第一次看本博客文章,请先看前面的内容。

3.2CallingaWebAPIFroma.NETClient(C#)

3.2通过.NET客户端调用WebAPI(C#)

本文引自:

ByMikeWasson|July18,2012

作者:

MikeWasson|日期:

2012-7-18

ThistutorialshowshowtocallawebAPIfromaconsoleapplication,usingHttpClient.

本教程展示如何在一个控制台应用程序中使用HttpClient调用WebAPI。

Inthistutorial,wewillconsumethe"ProductStore"API,describedinCreatingaWebAPIthatSupportsCRUDOperations.

在本教程中,我们将使用在“创建支持CRUD操作的WebAPI(本系列教程的第2.1小节—译者注)”小节中描述的“ProductStore”API。

CreatetheConsoleApplication

创建控制台应用程序

StartVisualStudioandselectNewProjectfromtheStartpage.Or,fromtheFilemenu,selectNewandthenProject.

启动Visualstudio,并从“开始”页面选择“新项目”。

或者从“文件”菜单选择“新建”,然后选择“项目”。

IntheTemplatespane,selectInstalledTemplatesandexpandtheVisualC#node.UnderVisualC#,selectWindows.Inthelistofprojecttemplates,selectConsoleApplication.NametheprojectandclickOK.

在“模板”面板中,选择“已安装模板”,并展开“VisualC#”节点。

在“VisualC#”下选择“Windows”。

在项目模板列表中选择“控制台应用程序”。

命名此项目并点击“OK”(见图3-1)。

图3-1.创建控制台项目

InstallNuGetPackageManager

安装NuGet包管理器

NuGetPackageManageristheeasiestwaytoaddtheWebAPIClientlibrarytoaproject.IfyoudonothaveNuGetPackageManageralreadyinstalled,installitasfollows.

“NuGet包管理器(NuGetPackageManager)”是把WebAPI客户端库添加到项目的一种最容易的方法。

如果尚未安装NuGet包管理器,按如下步骤安装。

1.StartVisualStudio.

启动VisualStudio.

2.FromtheToolsmenu,selectExtensionsandUpdates.

从“工具”菜单选择“扩展与更新”

3.IntheExtensionsandUpdatesdialog,selectOnline.

在“扩展与更新”对话框中,选择“在线”

4.Ifyoudon'tsee"NuGetPackageManager",type"nugetpackagemanager"inthesearchbox.

如果未看到“NuGet包管理器”,在搜索框中输入“nugetpackagemanager”。

5.SelecttheNuGetPackageManagerandclickDownload.

选择“NuGet包管理器”,并点击“下载”。

6.Afterthedownloadcompletes,youwillbepromptedtoinstall.

下载完成后,会提示你安装。

7.Aftertheinstallationcompletes,youmightbepromptedtorestartVisualStudio.

安装完成后,可能会提示重启VisualStudio。

上述安装过程如图3-2所示。

图3-2.安装NuGet包管理器

InstalltheWebAPIClientLibraries

安装WebAPI客户端库

AfterNuGetPackageManagerisinstalled,addtheWebAPIClientLibrariespackagetoyourproject.

安装NuGet包管理器后,把WebAPI客户端库包添加到你的项目。

步骤如下:

1.FromtheToolsmenu,selectLibraryPackageManager.Note:

Ifdoyounotseethismenuitem,makesurethatNuGetPackageManagerinstalledcorrectly.

从“工具”菜单选择“库包管理器”。

注:

如果看不到这个菜单项,请确保已正确安装了NuGet包管理器。

2.SelectManageNuGetPackagesforSolution...

选择“管理解决方案的NuGet包…”

3.IntheManageNuGetPackagesdialog,selectOnline.

在“管理NuGet包”对话框中,选择“在线”。

4.Inthesearchbox,type"Microsoft.AspNet.WebApi.Client".

在搜索框中输入“Microsoft.AspNet.WebApi.Client”。

5.SelecttheASP.NETWebAPISelfHostpackageandclickInstall.

选择“ASP.NETWebAPI自托管包”,并点击“安装”。

6.Afterthepackageinstalls,clickClosetoclosethedialog.

这个包安装后,点击“关闭”,关闭此对话框。

上述安装步骤如图3-3所示。

图3-3.安装WebAPI客户端库

AddtheModelClass

添加模型类

Addthefollowingclasstotheapplication:

将以下类添加到应用程序:

classProduct

{

publicstringName{get;set;}

publicdoublePrice{get;set;}

publicstringCategory{get;set;}

}

ThisclasscreatesadataobjectthatHttpClientwillwriteintotheHTTPrequestbodyandreadfromtheHTTPresponsebody.

这个类创建一个数据对象,HttpClient将把它写入HTTP请求体中,也从HTTP响应体中读取它。

InitializeHttpClient

初始化HttpClient

CreateanewinstanceofHttpClientandinitializeitasfollows:

创建一个新的HttpClient实例,并像下面这样初始化它:

namespaceProductStoreClient

{

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Net.Http;

usingSystem.Net.Http.Headers;

classProgram

{

staticvoidMain(string[]args)

{

HttpClientclient=newHttpClient();

client.BaseAddress=newUri("http:

//localhost:

9000/");

//AddanAcceptheaderforJSONformat.

//为JSON格式添加一个Accept报头

client.DefaultRequestHeaders.Accept.Add(

newMediaTypeWithQualityHeaderValue("application/json"));

}

}

}

ThiscodesetsthebaseURIto"http:

//localhost:

9000/",andsetstheAcceptheaderto"application/json",whichtellstheservertosenddatainJSONformat.

这段代码把基URI设置为“http:

//localhost:

9000/”,并将Accept报头设置为“application/json”,这是告诉服务器,以JSON格式发送数据。

GettingaResource(HTTPGET)

获取资源(HTTPGET)

ThefollowingcodeshowshowtoquerytheAPIforalistofproducts:

以下代码展示如何对产品列表查询API:

//Listallproducts.

//列出所有产品

HttpResponseMessageresponse=client.GetAsync("api/products").Result;//Blockingcall(阻塞调用)!

if(response.IsSuccessStatusCode)

{

//Parsetheresponsebody.Blocking!

//解析响应体。

阻塞!

varproducts=response.Content.ReadAsAsync>().Result;

foreach(varpinproducts)

{

Console.WriteLine("{0}\t{1};\t{2}",p.Name,p.Price,p.Category);

}

}

else

{

Console.WriteLine("{0}({1})",(int)response.StatusCode,response.ReasonPhrase);

}

TheGetAsyncmethodsendsanHTTPGETrequest.Asthenameimplies,GetAsycisasynchronous.Itreturnsimmediately,withoutwaitingforaresponsefromtheserver.ThereturnvalueisaTaskobjectthatrepresentstheasynchronousoperation.Whentheoperationcompletes,theTask.ResultpropertycontainstheHTTPresponse.

GetAsync方法发送HTTPGET请求。

正如其名称所暗示的,GetAsync是异步的。

它立即返回,不会等待服务器的响应。

返回值是一个表示异步操作的Task对象。

当该操作完成时,Task.Result属性包含HTTP响应。

ItisimportanttounderstandthattakingtheResultpropertyblocksyourapplicationthreaduntiltherequestcompletes(ortimesout).BlockinginaconsoleapplicationisOK,butyoushouldneverdothisontheUIthreadofaWindowsapplication,becauseitblockstheUIfromrespondingtouserinput.Inthenextpartofthistutorial,we'llseehowtowritenon-blockingcalls.

重要的是理解,直到请求完成(或超时),采用Result属性的过程是应用程序线程阻塞的。

控制台应用程序的阻塞没问题,但是,你决不应该在一个Windows应用程序的UI上做这种事,因为这会阻塞UI去响应用户的输入。

在本教程的下一部分中,我们将看到如何编写非阻塞调用。

IftheHTTPresponseindicatessuccess,theresponsebodycontainsalistofproductsinJSONformat.Toparsethelist,callReadAsAsync.ThismethodreadstheresponsebodyandtriestodeserializeittoaspecifiedCLRtype.Thismethodisalsoasynchronous,becausethebodycanbearbitrarilylarge.Again,takingtheResultpropertyblocksthethread.

如果HTTP响应指示成功,响应体便含有一个JSON格式的产品列表。

要解析这个列表,需调用ReadAsAsync。

该方法读取响应体,并试图把它解序列化成一个具体的CLR(公共语言运行时)类型。

这个方法也是异步的,因为体可能有任意大小。

再次强调,采用Result属性的过程是线程阻塞的。

ExampleHTTPsession:

HTTP会话示例:

GEThttp:

//localhost:

9000/api/productsHTTP/1.1

Accept:

application/json

Host:

localhost:

9000

Connection:

Keep-Alive

HTTP/1.1200OK

Server:

ASP.NETDevelopmentServer/11.0.0.0

Date:

Mon,20Aug201222:

14:

59GMT

X-AspNet-Version:

4.0.30319

Cache-Control:

no-cache

Pragma:

no-cache

Expires:

-1

Content-Type:

application/json;charset=utf-8

Content-Length:

183

Connection:

Close

[{"Id":

1,"Name":

"Tomatosoup","Category":

"Groceries","Price":

1.39},{"Id":

2,"Name":

"Yo-yo",

"Category":

"Toys","Price":

3.75},{"Id":

3,"Name":

"Hammer","Category":

"Hardware","Price":

16.99}]

GettingaproductbyIDissimilar:

通过ID获取产品是类似的:

//GetaproductbyID

//通过ID获取产品

response=client.GetAsync("api/products/1").Result;

if(response.IsSuccessStatusCode)

{

//Parsetheresponsebody.Blocking!

//解析响应休。

阻塞!

varproduct=response.Content.ReadAsAsync().Result;

Console.WriteLine("{0}\t{1};\t{2}",product.Name,product.Price,product.Category);

}

else

{

Console.WriteLine("{0}({1})",(int)response.StatusCode,response.ReasonPhrase);

}

Media-TypeFormatters

媒体类型格式化器

ReadAsAsyncisanextensionmethoddefinedintheSystem.Net.Http.HttpContentExtensionsclass.Withnoparameters,itusesthedefaultsetofmedia-typeformatterstotrytoparsetheresponsebody.ThedefaultformatterssupportJSON,XML,andForm-url-encodeddata.(Formoreinformationaboutmedia-typeformatters,seeFormatsandModelBinding.)

ReadAsAsync是在System.Net.Http.HttpContentExtensions类中定义的一个扩展方法。

不带参数,它会使用媒体类型格式化器的默认设置,以试图解析响应体。

默认格式化器支持JSON、XML和经过url编码的表单数据(Form-url-encodeddata)。

(关于媒体类型格式化器的更多信息,参阅“格式化与模型绑定(本教程系列的第6章—译者注)”)

Youcanalsoexplicitlyspecifythemedia-typesformatterstouse.Thisisusefulifyouhaveacustommedia-typeformatter.

也可以明确指定所使用的媒体类型格式化器。

如果你有一个自定义媒体类型格式化器,这是有用的。

varformatters=newList(){

newMyCustomFormatter(),

newJsonMediaTypeFormatter(),

newXmlMediaTypeFormatter()

};

resp.Content.ReadAsAsync>(formatters);

CreatingaResource(HTTPPOST)

创建一个资源(HTTPPOST)

ThefollowingcodesendsaPOSTrequestthatcontainsaProductinstanceinJSONformat:

以下代码发送一个POST请求,它含有一个JSON格式的Product实例:

//Createanewproduct

//创建一个新产品

vargizmo=newProduct(){Name="Gizmo",Price=100,Category="Widget"};

UrigizmoUri=null;

response=client.PostAsJsonAsync("api/products",gizmo).Result;

if(response.IsSuccessStatusCode)

{

gizmoUri=response.Headers.Location;

}

else

{

Console.WriteLine("{0}({1})",(int)response.StatusCode,response.ReasonPhrase);

}

PostAsJsonAsyncisanextensionmethoddefinedinSystem.Net.Http.HttpClientExtensions.Itisequivalenttothefollowing:

PostAsJsonAsync是在System.Net.Http.HttpClientExtensions中定义的一个扩展方法。

上述代码与以下代码等效:

varproduct=newProduct(){Name="Gizmo",Price=100,Category="Widget"};

//CreatetheJSONformatter.

//创建JSON格式化器。

MediaTypeFormatterjsonFormatter=newJsonMediaTypeFormatter();

//UsetheJSONformattertocreatethecontentoftherequestbody.

//使用JSON格式化器创建请求体内容。

HttpContentcontent=newObjectContent(product,jsonFormatter);

//Sendtherequest.

//发送请求。

varresp=client.PostAsync("api/products",content).Result;

ForXMLformat,usethePostAsXmlAsyncmethod.

对于XML格式,使用PostAsXmlAsync方法。

ExampleHTTPsession:

HTTP会话示例:

POSThttp:

//localhost:

9000/api/productsHTTP/1.1

Accept:

applicati

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 院校资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1