如何进行https webAPI调用?

时间:2017-01-23 13:55:50

标签: xamarin xamarin.forms

我正在尝试进行https webAPI调用,特别是Google Directions API。将uri直接放在浏览器中可以得到我想要的结果,所以我100%确定我的uri是正确的。

现在,如何在PCL中调用webapi?现在使用modernhttp和HttpClient,但对那里的任何选项都是开放的。

private async Task<string> GetJsonObjFromUrl(string urlRoutes)
{
    HttpClient c = new HttpClient(new NativeMessageHandler());

    var resp = await c.SendAsync(new HttpRequestMessage(HttpMethod.Get, new Uri(urlRoutes)));

    if (resp.IsSuccessStatusCode)
    {
        var json = await resp.Content.ReadAsStringAsync();

        return json;
    }

    return null;
}

我做错了什么?

编辑:只是把它放在这里因为这让我疯狂整夜。结束来电方式,上面的方式忘了等待。执行继续执行,永远不会返回以获得结果。这就是我从未得到任何结果的原因......:\

2 个答案:

答案 0 :(得分:1)

  

代码不会在client.SendAsync / GetStringAsync

下面的任何地方被击中

我怀疑您的调用堆栈越来越长,您的代码在任务上调用了Result / Wait / GetAwaiter().GetResult()。如果从UI线程调用,这将deadlock,正如我在我的博客上解释的那样。

死锁是由尝试在UI上下文中恢复的async方法引起的,但是阻止了UI线程等待任务完成。由于async方法必须完成以完成其任务,因此存在死锁。

正确的解决方法是将Result / Wait替换为await

答案 1 :(得分:0)

在您的PCL中使用:

HttpClient httpClient = new HttpClient();
var json = await httpClient.GetStringAsync(Url);

如果使用HTTPS。 在Android中,您的主要活动是:

protected override void OnCreate(Bundle bundle)
{
    ServicePointManager.ServerCertificateValidationCallback +=(sender, cert, chain, sslPolicyErrors) => true;
}

在iOS中,在AppDelegate中:

public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
    ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;

    return base.FinishedLaunching(app, options);
}