Мой вопрос: Как это сделать?Преобразование содержимого HttpResponseMessage в объект
Итак, я ничего не трогал .Net через 6 лет до этой недели. Я забыл и многое другое, что я никогда не знал, и, хотя мне нравится идея ключевых слов async/wait, у меня небольшая проблема, реализующая следующие требования для реализации API-интерфейса клиента:
- Класс
ServerAPI
имеет метод для каждого из методов API, используя соответствующие входные параметры (например, методLogin
принимает вid
иpassword
, вызывает вызов API и возвращает результат вызывающему абоненту). - Я хочу абстрагироваться от JSON, так что мои методы API возвращают сам объект вы выборка (например, метод
Login
выше возвращаетUser
объекта с токеном аутентификации, UID и т.д.) - Некоторых методов API вернуться 204 (без значимого в моей работе), возможно, я только забочусь об успехе/неудаче), для этого я хотел бы вернуть либо bool (
true
= успех), либо код состояния. - Я хотел бы сохранить асинхронный/ожидаемый (или эквивалентный) дизайн, потому что он действительно работает до сих пор.
- Для некоторых методов мне может потребоваться просто вернуть объект
HttpResponseMessage
и позволить вызывающему абоненту справиться с ним.
Это примерно то, что у меня есть до сих пор, и я не уверен, как сделать его совместимым с вышеизложенным. Или я даже делаю это правильно. Любое руководство ценится (пламя, однако, нет).
// 200 (+User JSON) = success, otherwise APIError JSON
internal async Task<User> Login (string id, string password)
{
LoginPayload payload = new LoginPayload() { LoginId = id, Password = password};
var request = NewRequest(HttpMethod.Post, "login");
JsonPayload<LoginPayload>(payload, ref request);
return await Execute<Account>(request, false);
}
// 204: success, anything else failure
internal async Task<Boolean> LogOut()
{
return await Execute<Boolean>(NewRequest(HttpMethod.Delete, "login"), true);
}
internal async Task<HttpResponseMessage> GetRawResponse()
{
return await Execute<HttpResponseMessage>(NewRequest(HttpMethod.Get, "raw/something"), true);
}
internal async Task<Int32> GetMeStatusCode()
{
return await Execute<Int32>(NewRequest(HttpMethod.Get, "some/intstatus"), true);
}
private async Task<RESULT> Execute<RESULT>(HttpRequestMessage request, bool authenticate)
{
if (authenticate)
AuthenticateRequest(ref request); // add auth token to request
var tcs = new TaskCompletionSource<RESULT>();
var response = await client.SendAsync(request);
// TODO: If the RESULT is just HTTPResponseMessage, the rest is unnecessary
if (response.IsSuccessStatusCode)
{
try
{
// TryParse needs to handle Boolean differently than other types
RESULT result = await TryParse<RESULT>(response);
tcs.SetResult(result);
}
catch (Exception e)
{
tcs.SetException(e);
}
}
else
{
try
{
APIError error = await TryParse<APIError>(response);
tcs.SetException(new APIException(error));
}
catch (Exception e)
{
tcs.SetException(new APIException("Unknown error"));
}
}
return tcs.Task.Result;
}
Это APIError
JSON структуры (это код состояния + пользовательский код ошибки).
{
"status": 404,
"code":216,
"msg":"User not found"
}
Я предпочел бы остаться с System.Net
, но это в основном потому, что я не хочу, чтобы переключить все мой код более. Если то, что я хочу, проще сделать другими способами, то это, безусловно, стоит дополнительной работы.
Спасибо.
* Мой вопрос: ** Как мне это сделать? *** Я бы сказал * Обзор кода * для кода, который вы считаете полным, а не кода, который вы не знаете, как завершить. – copolii
Попробуйте изучить '[JsonProperty (« myPropertyName »)]', это может вам помочь. – Lifes
Итак, вы имеете в виду, что вы уже выполнили весь проект UWP и протестировали его работу, но хотите знать, соответствуют ли эти коды вышеуказанным требованиям, и если кто-то знает лучший способ реализовать эти требования? –