我正试图在我的Xamarin.Forms
移动应用程序中使用HttpClient创建Web服务的层。
- 不使用单例模式
- 使用单例模式
在第一种方法中,我在移动应用程序发出的每个新请求中创建新的http客户端对象。
这是我的代码:
public HttpClient GetConnection()
{
HttpClient httpClient = new HttpClient();
httpClient.BaseAddress = new Uri(baseAddress);
httpClient.Timeout = System.TimeSpan.FromMilliseconds(timeout);
return httpClient;
}
发送Post请求的代码
public async Task<TResult> PostAsync<TRequest, TResult>(String url, TRequest requestData)
{
HttpClient client = GetConnection();
String responseData = null;
if (client != null)
{
String serializedObject = await Task.Run(() => JsonConvert.SerializeObject(requestData, _jsonSerializerSettings));
var jsonContent = new StringContent(serializedObject, System.Text.Encoding.UTF8, "application/json");
HttpResponseMessage response = await client.PostAsync(new Uri(url, UriKind.Relative), jsonContent);
responseData = await HandleResponse(response);
return await Task.Run(() => JsonConvert.DeserializeObject<TResult>(responseData, _jsonSerializerSettings));
}
else
{
throw new NullReferenceException("NullReferenceException @ PostAsync httpclient is null WebRequest.cs");
}
}
客户端将使用以下代码执行请求
new LoginService(new WebRequest()).UserLogin(userRequest);
实现 IWebRequest
接口的类内部
_webRequest.PostAsync<UserRequest,bool>(Constants.USER_LOGIN, userRequest);
在第二种方法中,我在每个新请求中都重复使用同一HTTP客户端对象。
在这里,我的单例类也是线程安全的。
private static readonly Lazy<HttpService> lazy =
new Lazy<HttpService>(() => new HttpService());
public static HttpService Instance { get { return lazy.Value; } }
private HttpClient getConnection()
{
client = new HttpClient();
client.Timeout = System.TimeSpan.FromMilliseconds(timeout);
//client.MaxResponseContentBufferSize = 500000;
client.BaseAddress = new Uri(baseAddress);
return client;
}
提交请求的代码
public Task<HttpResponseMessage> sendData(String url,String jsonData)
{
var jsonContent = new StringContent(jsonData, System.Text.Encoding.UTF8, "application/json");
return getConnection().PostAsync(new Uri(url, UriKind.Relative), jsonContent);
}
客户端将使用以下代码执行
HttpService.Instance.sendData(...)
我已经浏览了许多像 RestSharp
这样的库,只是为了探寻最好的库,但我发现它们大多数都会在每个请求中创建新的对象。因此,我很困惑哪种模式最适合。
HttpClient
,原因在于:这篇文章。 - DavidG