[英]consume web service in xamarin.forms json
我想在按鈕名稱和圖像徽標上的列表視圖中顯示源的值,因為我已經綁定了圖像源和名稱。 但是似乎沒有顯示結果。
public async Task<string> GetRequest (string url){
Uri geturi = new Uri("http://172.20.129.193/nypstudentlifeservice/");
HttpClient client = new HttpClient();
HttpResponseMessage responseGet = await client.GetAsync(geturi);
return responseGet.Content.ReadAsStringAsync().Result;
}
public async Task<IEnumerable<CsClubList>> getClubList()
{
string result = await GetRequest("api/club/list?categoryid=2");
CsClubList[] clublist = null;
var clubtoken = JObject.Parse(result)[0];
clublist = clubtoken.Select(clublists => new CsClubList()
{
Id = (int)clublists["Id"],
Name = (string)clublists["Name"],
Logo = (string)clublists["Logo"],
CategoryId = (int)clublists["CategoryId"]
}).ToArray();
return clublist;
}
這是我嘗試使用Json Web服務的代碼。
這是CsClubList
的類文件
public class CsClubList
{
public int Id{ get; set;}
public int CategoryId { get; set; }
public string Name {get; set;}
public string Logo {get; set;}
}
對於xaml.cs文件
public partial class ListClubs : ContentPage
{
private IEnumerable<CsClubList> _ClubList;
public ListClubs ()
{
InitializeComponent();
setClubs(Clublistview); //The statement is not awaited and execution of current method continues before the call is complete. Consider using 'await' operator or calling 'Wait' method
}
public IEnumerable<CsClubList> ClubList
{
get { return _ClubList; }
set { _ClubList = value; }
}
private async void setClubs(ListView listview)
{
ClubApiClient service = new ClubApiClient();
var clublist = await service.getClubList();
listview.ItemsSource = clublist.ToList();
}
}
這是xaml頁面:
<ListView x:Name="Clublistview">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout BackgroundColor="White"
Orientation="Vertical">
<StackLayout Orientation="Horizontal">
<Image Source="{Binding Logo}" IsVisible="true" WidthRequest="42" HeightRequest="42"/>
<Button Text="{Binding Name}" x:Name="BtnClub" AbsoluteLayout.LayoutBounds="100, 25, 100, 25" Clicked="OnListClubsClicked" TextColor="Black" VerticalOptions="FillAndExpand"/>
</StackLayout>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
這是Json Web服務的鏈接:
http://172.20.129.193/nypstudentlifeservice/api/club/list?categoryid=2
[{"Id":21,"CategoryId":2,"Name":"Chinese Cultural Group","Logo":"http://www.nyp.edu.sg/web/campus_life/cca/arts_&_culture/image/CCG2.png"},{"Id":22,"CategoryId":2,"Name":"Chinese Orchestra","Logo":"http://www.nyp.edu.sg/web/campus_life/cca/arts_&_culture/image/CO-ICON.png"},{"Id":23,"CategoryId":2,"Name":"Dance Company","Logo":"http://www.nyp.edu.sg/web/campus_life/cca/arts_&_culture/image/DC2.png"},{"Id":24,"CategoryId":2,"Name":"Danz Inc.","Logo":"http://www.nyp.edu.sg/web/campus_life/cca/arts_&_culture/image/DI-ICON.png"},{"Id":25,"CategoryId":2,"Name":"Der Treff German Club","Logo":"http://www.nyp.edu.sg/web/campus_life/cca/arts_&_culture/image/DTG-ICON.png"},{"Id":26,"CategoryId":2,"Name":"Foreign Bodies Dance Group","Logo":"http://www.nyp.edu.sg/web/campus_life/cca/arts_&_culture/image/FB-ICON.png"}]
您還沒有真正說明問題是什么或您的問題是什么,但這里有一些基於您提供的代碼的觀察。
您正在代碼中混合異步和同步調用。 不要在異步方法中使用.Result
或.Wait
。
從您嘗試以字符串形式讀取響應的行中刪除.Result
,並像處理HTTP請求一樣await
結果。
還注意到您沒有正確構建Uri以滿足您的要求。 您使用基址創建了一個Uri,但未包含提供的url參數。
public async Task<string> GetRequest(string url) {
Uri getUri = new Uri("http://172.20.129.193/nypstudentlifeservice/" + url);
HttpClient client = new HttpClient();
HttpResponseMessage responseGet = await client.GetAsync(getUri);
responseGet.EnsureSuccessStatusCode(); // Throw if not a success code.
string content = await responseGet.Content.ReadAsStringAsync();
return content;
}
public async Task<IEnumerable<CsClubList>> getClubList() {
string json = await GetRequest("api/club/list?categoryid=2");
List<CsClubList> clublist = JsonConvert.DeserializeObject<List<CsClubList>>(json);
return clublist;
}
除非它們是事件處理程序,否則您還應盡可能在void方法上使用async。
所以,如果可能的話,你需要改變它
//NO NO NO NO NO
private async void setClubs(ListView listview)
{
ClubApiClient service = new ClubApiClient();
var clublist = await service.getClubList();
listview.ItemsSource = clublist.ToList();
}
對此
private async Task setClubs(ListView listview)
{
ClubApiClient service = new ClubApiClient();
var clublist = await service.getClubList();
listview.ItemsSource = clublist.ToList();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.