Xamarin使用HttpClient类

相同,转自官网指南。本文演示了如何从Xamarin.Forms应用程序使用RESTful Web服务。

REST请求是通过HTTP使用Web浏览器用于检索网页并将数据发送到服务器的相同HTTP动词进行的。这些动词是:GET,POST,PUT,PATCH或DELETE。(都知道,就不解释了)

遵循REST的Web服务API称为RESTful API,并使用下面的定义:

 1.基本的URI。
 2.HTTP方法,如GET,POST,PUT,PATCH或DELETE。
 3.数据的媒体类型,例如JavaScript对象表示法(JSON)。

REST风格的Web服务通常使用JSON消息将数据返回给客户端。JSON是一种基于文本的数据交换格式,可生成紧凑的有效负载,从而在发送数据时降低带宽要求。示例应用程序使用开源的NewtonSoft JSON.NET库来序列化和反序列化消息。

REST的简单性使其成为访问移动应用程序中的Web服务的主要方法。
在iOS 9及更高版本中,应用程序传输安全性(ATS)强制实施互联网资源(如应用程序的后端服务器)与应用程序之间的安全连接,从而防止意外泄露敏感信息。由于ATS在默认情况下在为iOS 9构建的应用程序中启用,所有连接都将受到ATS安全要求的限制。如果连接不符合这些要求,它们将失败,例外。
如果不能使用HTTPS协议和互联网资源的安全通信,ATS可以退出。这可以通过更新应用程序的Info.plist文件来实现。有关更多信息,请参阅App Transport Security。

使用Web服务

在HttpClient类用于发送和接收通过HTTP请求。它提供了发送HTTP请求和从URI标识的资源接收HTTP响应的功能。每个请求都是作为异步操作发送的。有关异步操作的更多信息,请参阅异步支持概述

所述HttpResponseMessage类表示的HTTP请求作出后从所述web服务接收到的HTTP响应消息。它包含有关响应的信息,包括状态码,标题和任何正文。所述HttpContent类表示HTTP主体和内容报头,如Content-Type和Content-Encoding。内容可以使用任何ReadAs方法读取,例如ReadAsStringAsync和ReadAsByteArrayAsync,取决于数据的格式。

创建HTTPClient对象

该HttpClient实例在类级别声明,只要应用程序需要发出HTTP请求,该对象就存在,如以下代码示例所示:

public class RestService : IRestService
{
  HttpClient client;
  ...

  public RestService ()
  {
    client = new HttpClient ();
    client.MaxResponseContentBufferSize = 256000;
  }
  ...
}

该HttpClient.MaxResponseContentBufferSize属性用于指定读取HTTP响应消息中的内容时要缓冲的最大字节数。此属性的默认大小是整数的最大大小。因此,为了限制应用程序将接受作为Web服务响应的数据量,将该属性设置为较小的值作为安全措施。

检索数据

该HttpClient.GetAsync方法用于将GET请求发送到由URI指定的Web服务,然后接收来自Web服务的响应,如以下代码示例所示:

public async Task<List<TodoItem>> RefreshDataAsync ()
{
  ...
  // RestUrl = http://developer.xamarin.com:8081/api/todoitems/
  var uri = new Uri (string.Format (Constants.RestUrl, string.Empty));
  ...
  var response = await client.GetAsync (uri);
  if (response.IsSuccessStatusCode) {
      var content = await response.Content.ReadAsStringAsync ();
      Items = JsonConvert.DeserializeObject <List<TodoItem>> (content);
  }
  ...
}

REST服务在HttpResponseMessage.IsSuccessStatusCode属性中发送HTTP状态码,以指示HTTP请求是成功还是失败。对于此操作,REST服务会在响应中发送HTTP状态码200(OK),表示请求成功,请求的信息在响应中。

如果HTTP操作成功,则读取响应的内容以进行显示。该HttpResponseMessage.Content属性表示HTTP响应的内容,并且该HttpContent.ReadAsStringAsync方法将HTTP内容异步写入字符串。这个内容然后从JSON转换List为TodoItem实例。

创建数据

该HttpClient.PostAsync方法用于将POST请求发送到由URI指定的Web服务,然后接收来自Web服务的响应,如以下代码示例所示:

public async Task SaveTodoItemAsync (TodoItem item, bool isNewItem = false)
{
  // RestUrl = http://developer.xamarin.com:8081/api/todoitems/
  var uri = new Uri (string.Format (Constants.RestUrl, string.Empty));

  ...
  var json = JsonConvert.SerializeObject (item);
  var content = new StringContent (json, Encoding.UTF8, "application/json");

  HttpResponseMessage response = null;
  if (isNewItem) {
    response = await client.PostAsync (uri, content);
  }
  ...

  if (response.IsSuccessStatusCode) {
    Debug.WriteLine (@"             TodoItem successfully saved.");

  }
  ...
}

该TodoItem实例被转换为JSON有效负载以发送到Web服务。然后,该有效负载将被嵌入HTTP请求与该PostAsync方法进行发送之前将被发送到Web服务的内容。

REST服务在HttpResponseMessage.IsSuccessStatusCode属性中发送HTTP状态码,以指示HTTP请求是成功还是失败。这个操作的共同反应是:

  201(CREATED) - 请求导致在发送响应之前创建新的资源。
  400(BAD REQUEST) - 请求不被服务器理解。
  409(CONFLICT) - 由于服务器上的冲突,请求无法执行。

更新数据

该HttpClient.PutAsync方法用于将PUT请求发送到由URI指定的Web服务,然后接收来自Web服务的响应,如以下代码示例所示:

public async Task SaveTodoItemAsync (TodoItem item, bool isNewItem = false)
{
  ...
  response = await client.PutAsync (uri, content);
  ...
}

该PutAsync方法的操作与PostAsync用于在Web服务中创建数据的方法相同。但是,从Web服务发送的可能响应不同。

REST服务在HttpResponseMessage.IsSuccessStatusCode属性中发送HTTP状态码,以指示HTTP请求是成功还是失败。这个操作的共同反应是:

 204(无内容) - 请求已成功处理,响应有意空白。
 400(BAD REQUEST) - 请求不被服务器理解。
 404(NOT FOUND) - 请求的资源在服务器上不存在。

废除数据

该HttpClient.DeleteAsync方法用于将DELETE请求发送到由URI指定的Web服务,然后接收来自Web服务的响应,如以下代码示例所示:

public async Task DeleteTodoItemAsync (string id)
{
  // RestUrl = http://developer.xamarin.com:8081/api/todoitems/{0}
  var uri = new Uri (string.Format (Constants.RestUrl, id));
  ...
  var response = await client.DeleteAsync (uri);
  if (response.IsSuccessStatusCode) {
    Debug.WriteLine (@"             TodoItem successfully deleted.");
  }
  ...
}

REST服务在HttpResponseMessage.IsSuccessStatusCode属性中发送HTTP状态码,以指示HTTP请求是成功还是失败。这个操作的共同反应是:

 204(无内容) - 请求已成功处理,响应有意空白。
 400(BAD REQUEST) - 请求不被服务器理解。
 404(NOT FOUND) - 请求的资源在服务器上不存在。

概要

本文介绍了如何使用HttpClient类从Xamarin.Forms应用程序中使用REST风格的Web服务。REST的简单性使其成为访问移动应用程序中的Web服务的主要方法。

猜你喜欢

转载自blog.csdn.net/weixin_40132006/article/details/78710493