试图调用rest apis,但获取http请求异常

时间:2018-04-23 11:17:36

标签: c# .net rest api xamarin.forms

我试图在Xamarin中创建一些宁静的API调用。我已经在swagger中测试了API,在授权后我得到了200响应。然而,当我搬到我的Xamarin项目时,它出错:

http request exception

这是我的代码:

public partial class MainPage : ContentPage
{
    private readonly HttpClient _client = new HttpClient();

    public MainPage()
    {
        InitializeComponent();
        GetRoles();
    }

    private async void GetRoles() 
    {
        var result = await 
     _client.GetStringAsync("http://localhost/CherwellAPI/api/V2/getroles");
        var role = JsonConvert.DeserializeObject<List<Roles>>(result);
        RoleListView.ItemsSource = role;
    }
}

}

我也有角色模型:

 public class Roles
{
    public string RoleId { get; set; }
    public string RoleName { get; set; }
}

我的xaml文件是:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:local="clr-namespace:CherwellRolesApp"
         x:Class="CherwellRolesApp.MainPage">

<Label Text="Cherwell Roles App" TextColor="Azure" HorizontalOptions="Center" VerticalOptions="Center"></Label>

<ListView x:Name="RoleListView">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <StackLayout>
                    <Label Text="{Binding RoleName}" TextColor="Black"></Label>
                    <Label Text="{Binding RoleId}" TextColor="Black"></Label>
                </StackLayout>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

如果有人知道在哪里上楼梯,因为这是一个无益的例外,并没有提供任何更多的图像提供。我会很高兴,因为我是宁静API的新手。

4 个答案:

答案 0 :(得分:3)

如果您使用的是Andriod模拟器

localhost(127.0.0.1)指的是设备自己的环回服务,而不是您所期望的机器上的环回服务。

您可以使用10.0.2.2访问您的实际计算机,它是一个设置为帮助开发的别名。

此外,如果您从IISExpress运行此休息服务,您将再次遇到更多问题,并且您必须将配置设置为远程呼叫除外

答案 1 :(得分:1)

问题是您正在致电localhost

当您将其移至应用时localhost是您的设备或模拟器。提供运行服务器应用程序的实际服务器的地址。这可以是本地的或远程的,只要它可以通过同一网络到达。

测试时,它可能以192.168.x.x或10.x.x.x

开头

答案 2 :(得分:1)

我过去曾经有这个,刚刚开始学习API等等。但是当没有给出明确答案时尝试捕捉错误(如前所述!)。

这可能取决于你的API的类型;从观察代码开始,您可以调用需要身份验证/授权的API。这个woud导致异常,但通常你会看到401:Unauthorized etc。

如果您在swagger工具中进行身份验证,则需要使用IDE。

答案 3 :(得分:0)

其他答案已经解决了localhost问题。

此外,应该避免使用async void,因为async void方法抛出的异常因为它们的火灾而忘记了性质而无法捕获。这可能会使您的代码不稳定。

参考Async/Await - Best Practices in Asynchronous Programming

该规则的一个例外是事件处理程序。

重构GetRoles()以返回async Task并向页面添加事件和处理程序

public partial class MainPage : ContentPage {
    private readonly HttpClient _client = new HttpClient();

    public MainPage() {
        InitializeComponent();
        DataLoading += OnRolesLoading;
        RolesLoading(this, EventArgs.Empty);
    }

    private event EventHandler RolesLoading = delegate { };

    private async void OnRolesLoading(object sender, EventArgs args) {
        //DataLoading -= OnRolesLoading; //Optional
        try {
            await GetRoles();
        } catch {
            //...handler error
        }
    }

    private async Task GetRoles() {
        var result = await _client.GetStringAsync("{endpoint here}");
        var role = JsonConvert.DeserializeObject<List<Roles>>(result);
        RoleListView.ItemsSource = role;
    }
}