Xamarin HttpClient如何获取json并使用它

时间:2017-05-01 20:20:20

标签: c# json xamarin

首先,我想说我一直在阅读https://developer.xamarin.com/guides/xamarin-forms/cloud-services/consuming/rest/指南,但它没有帮助。

我有一个phpwebservice,在被问到时会返回json:

$.ajax({
    url: "/main/sub",
    data: data,
    traditional: true
})

它给出了这种类型的响应

    <?php

include("../include/class.pdogsb.inc.php");


$pdo = PdoGsb::getPdoGsb();


$tabCabinets = $pdo->getLesCabinets();



    header('Content-type: application/json');
    echo json_encode(array('cabinets'=>$tabCabinets));

?>

在我的xamarin PCL项目中,我创建了一个方法,当我加载视图来获取json数据时,我使用该方法。

cabinets": [

    {
        "0": "1",
        "1": "2,2891506",
        "2": "48,8618687",
        "3": "75016",
        "4": "Paris",
        "5": "1 Avenue Gustave V de Suède",
        "id": "1",
        "longitudeGPS": "2,2891506",
        "latitudeGPS": "48,8618687",
        "cp": "75016",
        "ville": "Paris",
        "rue": "1 Avenue Gustave V de Suède"
    },

我的问题是,在执行和调试应用程序时,编译器不会追踪 using Newtonsoft.Json; using suivAAndroid.Models; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Net.Http; using System.Text; using System.Threading.Tasks; namespace suivAAndroid.ViewModel { public partial class CreerVisiteViewModel : INotifyPropertyChanged { #region propriétés private Cabinet unCabinet; private Medecin unMedecin; public event PropertyChangedEventHandler PropertyChanged; #endregion #region methods public CreerVisiteViewModel() { loadcabinets(); } private async Task loadcabinets() { List<Cabinet> listeCabinets = null; HttpClient clientCabinets = new HttpClient(); string url = "http://10.0.0.5/ppe3JoJuAd/gsbAppliFraisV2/webservices/w_cabinet.php"; //does not read the code after this line var response = await clientCabinets.GetAsync(new Uri(url)); string jsonString = await response.Content.ReadAsStringAsync(); listeCabinets = JsonConvert.DeserializeObject<List<Cabinet>>(jsonString); } #endregion } } 行。相反,它返回string url = "10.0.0.5/ppe3JoJuAd/gsbAppliFraisV2/webservices/w_cabinet.php";,这意味着客户端永远不会获取json数据。

我该怎么办?

编辑:更新了最近答案的代码

我创建了一个BaseViewModel,其中我实现了Icommand接口

loadcabinets();

以下是我以前的ViewModel

中的结果
public class RelayCommandAsync : ICommand
    {
        private Func<object, Task> _action;
        private Task _task;

        public RelayCommandAsync(Func<object, Task> action)
        {
            _action = action;
        }

        public bool CanExecute(object parameter)
        {
            return _task == null || _task.IsCompleted;
        }

        public event EventHandler CanExecuteChanged;

        public async void Execute(object parameter)
        {
            _task = _action(parameter);
            OnCanExecuteChanged();
            //await _task;
            //OnCanExecuteChanged();
        }

        private void OnCanExecuteChanged()
        {
            var handler = this.CanExecuteChanged;
            if (handler != null)
                handler(this, EventArgs.Empty);
        }
    }

编译器没有阅读所有方法的代码仍然无法解决我的问题,我还能做些什么呢?

1 个答案:

答案 0 :(得分:1)

这里有几个问题:

  1. 您正在调用异步方法而不等待它。
  2. 您正在构造函数中调用异步方法
  3. 您正在调用多个异步方法,而不使用ConfigureAwait(false),这意味着您来回切换上下文
  4. 您的网址没有有效的方案,因此您可能会在那里获得例外
  5. 如果要使用MVVM模式,可以将代码包装在ICommand中,并执行该命令,以填充ObservableCollection。该命令的执行将在ViewController / Activity / Page的Lifecycle事件中发生,具体取决于您所使用的平台。