在本文中,将探讨如何使用RestSharp在Windows Phone上调用ASP.NET Web API。将创建一个简单的演示应用程序,使用已经开发的简单RESTful服务。不会在本文中开发任何服务,尽管将使用已经开发的服务。不会详细讨论Windows Phone的特性,唯一要讨论的是显示和使用API的JSON数据/响应。
需要以下条件来继续本文/帖子:
在本文/帖子中,将使用之前创建的ASP.NET Web API,托管在http://crudwithwebapi.azurewebsites.net/。
将尝试在本文中讨论非常简单的资源。以下是Web API的资源:
操作 | HTTP方法 | 相对URI |
---|---|---|
获取服务器数据列表 | GET | /api/serverdata |
通过ID获取服务器数据 | GET | /api/serverdata/id |
通过数据类型获取服务器数据 | GET | /api/serverdata/type/datatype |
通过机器IP获取服务器数据 | GET | /api/serverdata/ip/ip |
创建新的服务器数据 | POST | /api/serverdata |
更新现有的服务器数据 | PUT | /api/serverdata/id |
删除现有的服务器数据 | DELETE | /api/serverdata/id |
按照以下步骤创建一个示例项目:
将得到一个空白的Windows Phone应用程序。
在xaml文件中添加以下XAML代码:
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<ListBox x:Name="LstServerData">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Background="DarkOrange" Width="460" Height="150" Margin="0,10,0,0">
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding Title}" Foreground="Black" FontSize="30" Margin="10,10,0,0"/>
<TextBlock Text="{Binding Description}" FontSize="20" Margin="10,10,20,0" TextWrapping="Wrap"/>
</StackPanel>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
在数据模型文件夹下添加新的类ServerData.cs,并编写以下代码:
public class ServerData
{
public int Id { get; set; }
public string InitialDate { get; set; }
public string EndDate { get; set; }
public int OrderNumber { get; set; }
public bool IsDirty { get; set; }
public string IP { get; set; }
public int Type { get; set; }
public int RecordIdentifier { get; set; }
}
这一部分是可选的,没有在演示中使用HTTP客户端。如果是HTTP客户端的粉丝,这一部分是为阅读并相应地修改应用程序的。
将使用ASP.NET Web API,其响应为JSON,因此需要HTTP客户端和JSON.NET(用于序列化/反序列化JSON数据)。
打开Nuget管理控制台并输入以下命令:
Install-Package Microsoft.Net.Http
Install-Package Newtonsoft.Json
或者,可以使用Nuget对话框窗口添加对两者的支持:
private async void GetServerData_HTTPClient(object sender, RoutedEventArgs e)
{
try
{
using (HttpClient client = new HttpClient())
{
client.BaseAddress = new Uri("http://crudwithwebapi.azurewebsites.net");
var url = "api/serverdata";
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = await client.GetAsync(url);
if (response.IsSuccessStatusCode)
{
var data = response.Content.ReadAsStringAsync();
var lstData = JsonConvert.DeserializeObject<List<ServerData>>(data.Result.ToString());
LstServerData.ItemsSource = lstData;
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
在本文中,将使用RestSharp for Windows Phone作为ReST客户端。让从Nuget添加:
Install-Package RestSharp
现在,准备编写一个简单的代码来调用Web API。
让保持简单,所以,在MainPage.xaml文件中添加以下XAML代码。
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<ListBox x:Name="LstServerData">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Background="DarkOrange" Width="460" Height="150" Margin="0,10,0,0">
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding Title}" Foreground="Black" FontSize="30" Margin="10,10,0,0"/>
<TextBlock Text="{Binding Description}" FontSize="20" Margin="10,10,20,0" TextWrapping="Wrap"/>
</StackPanel>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
只需在上述代码片段之前添加以下几行,就可以为应用程序制作一个体面的标题:
<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
<TextBlock Text="Demo: Consume Web API" Style="{StaticResource PhoneTextNormalStyle}" Margin="12,0" />
<TextBlock Text="Server Data" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}" />
</StackPanel>
为了确保正在调用Web API,需要一个方法来进行调用。希望这个演示尽可能简单,所以不考虑任何模式和编程原则,如果想扩展,请尝试使用一些SOLID编程原则。要了解更多关于SOLID原则的信息,请阅读本文:
SOLID编程原则。
要进行调用,只需将以下代码片段添加到MainPage.xaml.cs文件中:
private void GetServerData()
{
const string url = "http://crudwithwebapi.azurewebsites.net";
var client = new RestClient(url);
var request = new RestRequest("api/serverdata", Method.GET) { RequestFormat = DataFormat.Json };
client.ExecuteAsync<List<ServerData>>(request, response =>
{
LstServerData.ItemsSource = response.Data;
});
}
在这里,只是定义了url和一个资源类型,这是情况下的GET,然后进行了异步调用。不会详细讨论这个。如果想了解更多,建议阅读并行编程。
现在只需从MainPage()调用方法,就像下面所示:
public MainPage()
{
InitializeComponent();
GetServerData();
}
准备好在手机上看到一些令人敬畏的结果。
只需运行演示,将在Windows Phone模拟器中得到一个体面的移动页面:
收到了输出并消费了ASP.NET WEBAPI,已经完成了主要主题。但是,在这里想让注意上面的输出。
注意到了吗?
在第一时间,并没有注意到,但再看一眼。啊!在这里,需要做一些改变,日期格式并不好,实际上,正在显示从WEB API接收到的日期。这些日期是JSON格式的,并且具有UNIX格式。让使它们易于阅读。
将DataType从string更改为DateTime,并定义自己的格式:
public String Description
{
get
{
return string.Format("Start Date:{0}, End Date:{1}, Order Number:{2}, IP:{3}, Record Type:{4}",
InitialDate.ToString("F"), EndDate.ToString("F"), OrderNumber, IP, Type);
}
}