Xamarin Forms HttpClient PostAsync不返回响应

时间:2018-06-28 08:22:16

标签: c# json xamarin.forms async-await httpclient

我正在尝试通过传递服务url和json参数来获取API响应。网址和参数正确传递给了 requestAPI 函数,但没有提供 PostAsync 方法的响应。网址是API位置,参数是类别ID。当我在浏览器中运行相同的API时,它会给出正确的响应。但不在应用程序中。

这是 requestAPI 函数。

public async Task<ResponseObject> requestAPI(string urlString, string jsonParameters)
        {
            await Task.Delay(2000); // NOTE: just to simulate a HTTP request over the wire

            try
            {
                var json = JsonConvert.SerializeObject(jsonParameters);
                HttpContent httpContent = new StringContent(json, Encoding.UTF8, "application/json");

                HttpResponseMessage response = null;

                if (true)       // no issue here.
                {                                                    
                    response = await client.PostAsync(urlString, httpContent);
                }
                else
                {
                    response = await client.PutAsync(urlString, httpContent);
                }

                if (response.IsSuccessStatusCode)
                {
                    Debug.WriteLine(@"              TodoItem successfully saved.");
                    var returnVal = await response.Content.ReadAsStringAsync();
                    return new ResponseObject{
                        jsonString = returnVal,
                        isSuccess = true,
                        error = null
                    };
                }
                else
                {
                    return new ResponseObject
                    {
                        jsonString = null,
                        isSuccess = false,
                        error = null
                    };
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(@"              ERROR {0}", ex.Message);
                return new ResponseObject
                {
                    jsonString = null,

                    isSuccess = false,
                    error = null
                };
            }
        }

类别ID来自此方法。

private async void loadBookList(string categoryId)
        {
            IsBusy = true;

            if (CrossConnectivity.Current.IsConnected)
            {
                ResponseObject responseObject = await _apiService.requestAPI("http://192.168.0.35/kiyawamu-api/index.php/rest/V1/mobileappintegration/getbookdetailsbycategory", Convert.ToString(categoryId));

                if (responseObject.isSuccess)
                {
                    var jsonObject = JsonConvert.DeserializeObject<BookListJsonObject>(responseObject.jsonString);
                    CategoryBooks = new ObservableCollection<Book>(jsonObject.booksByCategory);
                }
                else
                {
                    giveAlertForCommonError();
                }
            }
        }

我尝试了以下解决方案,但不起作用。

  1. 用作uri var uri = new Uri(urlString);的网址
  2. jsonParameter也用作字符串
  3. 还使用了
  4. GetAsync

在此方面的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

如果您正在Android上运行它,并且代码在PCL中,请尝试添加ModernHttpClient,以便可以使用本机HttpClientHandler。

https://github.com/paulcbetts/ModernHttpClient

但我也建议所有人从PCL升级到.NET标准。如果这样做,则不必安装NuGet包即可使用HttpCliennt。然后,您可以在项目设置中选择HttpClientHandler的实现。