.Net Core 3.1 中将 http 响应转换为 json 格式

问题描述

我有一个返回 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;
        }
    }

函数返回以下错误

enter image description here

解决方法

你可以这样做:

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; }
}