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