我有一个Web Api,它从SQL数据库中检索数据。我需要在xamrin中使用web api for android。我不知道如何根据按钮点击事件调用GET和Post方法。现在使用我编写的代码,当我单击按钮填充列表时,我在应用程序中得到一个空白屏幕。我的API在Postman中运行良好,但我不知道如何使它在Xamarin Android App上运行。
我在我的解决方案中创建了一个单独的库,它包含我的模型和API服务类。
Web API获取列表方法
// GET: api/Books
[HttpGet]
[Route("api/books")]
public IHttpActionResult Get()
{
IEnumerable<BookDTO> books;
books = from b in db.Books
select new BookDTO()
{
Id = b.Id,
Title = b.Title,
AuthorName = b.Author.Name
};
return Ok(books);
}
API服务类
public static async Task<BookDTO> GetBooks()
{
var client = new HttpClient();
var msg = await client.GetAsync(url);
if (msg.IsSuccessStatusCode)
{
using (var stream = await msg.Content.ReadAsStreamAsync())
{
using (var streamReader = new StreamReader(stream))
{
var str = await streamReader.ReadToEndAsync();
var obj = JsonConvert.DeserializeObject<BookDTO>(str);
return obj;
}
}
}
return null;
}
MainActivity.cs
public class MainActivity : Activity
{
static readonly List<string> _bookTitles = new List<string>();
private ListView _list;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.Main);
// Get the button from the layout Resource and attach an event to it
Button getBooks = FindViewById<Button>(Resource.Id.GetBooks);
_list = FindViewById<ListView>(Resource.Id.listView1);
getBooks.Click += async (sender, e) =>
{
var books = await BooksApiService.GetBooks();
ShowTitles(books);
};
}
private void ShowTitles(BookDTO books)
{
_bookTitles.Clear();
foreach (var book in books.Title)
{
_bookTitles.Add(book.ToString());
}
}
答案 0 :(得分:2)
您的Web API方法的返回类型为testImgView.setImageURI(Uri.parse(imageUri));
。这意味着您将IEnumerable书籍列表返回到客户端应用程序。
做出这些微小的改变:
API服务类
IEnumerable<BookDTO>
将任务的返回类型更改为public static async Task<IEnumerable<BookDTO>> GetBooks()
{
var client = new HttpClient();
,如上所示。
IEnumerable<BookDTO>
将要反序列化的类型从if (msg.IsSuccessStatusCode)
{
using (var stream = await msg.Content.ReadAsStreamAsync())
{
using (var streamReader = new StreamReader(stream))
{
var str = await streamReader.ReadToEndAsync();
var obj = JsonConvert.DeserializeObject<IEnumerable<BookDTO>>(str);
return obj;
}
}
}
更改为BookDTO
,如上所示。
<强> MainActivity.cs 强>
IEnumerable<BookDTO>
ShowTitles()应该以{{1}}作为参数,因为您可能想要遍历每本书并检索相应的标题并将其添加到 _bookTitles 列表。
private void ShowTitles(IEnumerable<BookDTO> books)
{
...
/*Change this block accordingly.*/
foreach (var book in books)
{
_bookTitles.Add(book.Title.ToString());
}
...
}
但是,上面的部分将保持原样,因为您使用了 var 类型,这意味着编译器将根据用途确定变量的显式类型。
答案 1 :(得分:1)
我的API在Postman中运行良好,但我不知道如何使它在Xamarin Android App上运行。
问题是,在服务器端,您返回IEnumerable<BookDTO>
个对象。但在客户端,您使用BookDTO
将其反序列化为var obj = JsonConvert.DeserializeObject<BookDTO>(str);
对象。
请尝试使用IEnumerable<BookDTO>
var obj = JsonConvert.DeserializeObject<IEnumerable<BookDTO>>(str);
如果问题仍然存在,请调试以str
var str = await streamReader.ReadToEndAsync();
的内容