Я пытаюсь создать слой для webservice с помощью HttpClient в своем мобильном приложении Xamarin.Forms
.
- без синглтонного рисунка
- с одноточечным рисунком
в первом подходе я создаю новый клиентский объект http в каждом новом запросе, сделанном мобильным аппликатором.
вот мой код
public HttpClient GetConnection()
{
HttpClient httpClient = new HttpClient();
httpClient.BaseAddress = new Uri(baseAddress);
httpClient.Timeout = System.TimeSpan.FromMilliseconds(timeout);
return httpClient;
}
почтовый запрос
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
через Интернет, чтобы исследовать лучшее, и я обнаружил, что большинство из них создают новые объекты за запрос. поэтому я смущен, какой образец подходит лучше всего.