【问题标题】:How to make https webAPI call?如何进行 https webAPI 调用?
【发布时间】:2017-01-24 04:23:06
【问题描述】:

我正在尝试进行 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;
}

我做错了什么?

编辑:把它放在这里是因为这让我整晚都发疯了。以调用者方式结束,上面的方式忘记了等待。执行之后立即继续,并且永远不会返回以获得结果。这就是为什么我从来没有得到任何结果... :\

【问题讨论】:

标签: xamarin xamarin.forms


【解决方案1】:

代码不会在 client.SendAsync / GetStringAsync 下面的任何地方命中

我怀疑你的调用堆栈更进一步,你的代码正在调用 Result / Wait / GetAwaiter().GetResult() 任务。如果从 UI 线程调用,这将是 deadlock,正如我在我的博客中解释的那样。

死锁是由于async 方法试图在 UI 上下文上恢复,但 UI 线程在等待任务完成时被阻塞。由于async 方法必须完成才能完成其任务,因此出现了死锁。

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

【讨论】:

    【解决方案2】:

    在您的 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);
    }
    

    【讨论】:

    • 它似乎不适用于 https。这应该与https一起使用吗?
    • 如果证书不可信,你应该使用:ServerCertificateValidationCallback,并自己接受它来建立TLS会话
    • 你的意思是这样的:stackoverflow.com/questions/22251689/…? WebRequestHandler 类不在 XF 中。如何建立 TLS?
    • 我的意思只是:ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
    • 好吧,我在这里完全超出了我的深度。你能举一个完整的例子吗?我不是网络开发人员,只是将其作为自学。如何/在哪里订阅 ServerCertificateValidationCallback?
    猜你喜欢
    • 2017-08-31
    • 2016-03-05
    • 2014-03-17
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多