问题描述
我有一个返回 http 响应的函数,我想将此返回转换为 json 格式,以便能够在特定模型中检索和分配一些值。 我用的是net core 3.1
这是我想要制作的模型:
public class UserSharePointviewmodel
{
public string displayName { get; set; }
public string AccountName { get; set; }
public string Email { get; set; }
public string Picture { get; set; }
}
这是我的功能:
public async Task<UserSharePointviewmodel> GetUserProfilInfoFromSharePoint()
{
string accesstoken = await GetAccesstoken();
using (var httpClient = new HttpClient())
{
httpClient.BaseAddress = new Uri(_configuration["SharePointConfiguration:WebSiteUrl"]);
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer",accesstoken);
var response = await httpClient.GetAsync("_api/SP.UserProfiles.PeopleManager/GetPropertiesFor(accountName=@v)?@v='i:0%23.f|membership|mellafi@naxxum.fr'");
var finalData = await response.Content.ReadAsstringAsync();
var _dataResponse = JToken.Parse(JsonConvert.SerializeObject(finalData));
UserSharePointviewmodel userResult = new UserSharePointviewmodel()
{
AccountName = _dataResponse["AccountName"].ToString(),Email = _dataResponse["Email"].ToString(),displayName = _dataResponse["PersonalUrl"].ToString(),Picture = _dataResponse["PictureUrl"].ToString()
};
return userResult;
}
}
解决方法
你可以这样做:
private static readonly HttpClient httpcLient = new HttpClient();
public async Task<UserSharePointViewModel> GetUserProfilInfoFromSharePoint()
{
string accessToken = await GetAccessToken();
httpClient.BaseAddress = new Uri(_configuration["SharePointConfiguration:WebSiteUrl"]);
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer",accessToken);
var response = await httpClient.GetAsync("url");
var finalData = await response.Content.ReadAsStringAsync();
var _dataResponse = JsonConvert.DeserializeObject<UserSharePointViewModel>(finalData));
UserSharePointViewModel userResult = new UserSharePointViewModel()
{
AccountName = _dataResponse.AccountName,Email = _dataResponse.Email,DisplayName = _dataResponse.PersonalUrl,Picture = _dataResponse.PictureUrl
};
return userResult;
}
顺便说一下,您不应该像使用 HTTP 那样使用 HTTP,HttpClient 应该是静态的并且可以重复使用,您不应该对 HttpClient 使用“using”。 查看更多信息:https://www.aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/
,首先将“finalData”反序列化为其对应的对象 (UserSharePointResponse),然后转换为 UserSharePointViewModel 将是轻而易举的事。我也将 Task<UserSharePointViewModel>
改为 Task<JsonResult>
(虽然不是必需的)
public async Task<JsonResult> /*Task<UserSharePointViewModel>*/ GetUserProfilInfoFromSharePoint()
{
string accessToken = await GetAccessToken();
using (var httpClient = new HttpClient())
{
httpClient.BaseAddress = new Uri(_configuration["SharePointConfiguration:WebSiteUrl"]);
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer",accessToken);
var response = await httpClient.GetAsync("_api/SP.UserProfiles.PeopleManager/GetPropertiesFor(accountName=@v)?@v='i:0%23.f|membership|mellafi@naxxum.fr'");
var finalData = await response.Content.ReadAsStringAsync();
//var _dataResponse = JToken.Parse(JsonConvert.SerializeObject(finalData));
var _dataResponse = JsonConvert.DeserializeObject<UserSharePointResponse>(finalData);
UserSharePointViewModel userResult = new UserSharePointViewModel()
{
AccountName = _dataResponse.AccountName,Picture = _dataResponse.PictureUrl
};
//return userResult;
return Json(userResult,JsonRequestBehavior.AllowGet);
}
}
public class UserSharePointResponse
{
public string PersonalUrl { get; set; }
public string AccountName { get; set; }
public string Email { get; set; }
public string PictureUrl { get; set; }
}