Использование веб-api с базовой аутентификацией RestSharp возвращает null

#http #asp.net-core #asp.net-web-api #basic-authentication #restsharp

#http #asp.net-core #asp.net-web-api #базовая аутентификация #restsharp

Вопрос:

Я пытаюсь использовать конечную точку с помощью RestSharp с базовой аутентификацией. Я следовал инструкциям в документации https://restsharp.dev/getting-started/getting-started.html Запрос прошел успешно, но я думаю, что тело запроса было искажено.

Как я могу заставить это работать

   internal BalanceInquiryResponse BalanceInquiryRest(BalanceInquiryRequest BalanceInquiryRequest, Settings Settings)
        {
          // BalanceInquiryResponse BalanceInquiryResponse = new BalanceInquiryResponse();
            
            var client = new RestClient(Settings.BaseUrl   "All/Inquiry");
            client.Authenticator = new HttpBasicAuthenticator(Settings.Username, Settings.Password);
            client.Timeout = -1;
            var request = new RestRequest(Method.POST);
            request.AddHeader("Content-Type", "application/json");
            request.AddJsonBody(new
            {
                Acc = BalanceInquiryRequest.Acc
            });

            IRestResponse response = client.Execute(request);
            IRestResponse<BalanceInquiryResponse> res = client.Execute<BalanceInquiryResponse>(request);
                        
            if (response.IsSuccessful)
            {
                BalanceInquiryResponse = new BalanceInquiryResponse
                {
                    responseInquiry = res.Data.responseInquiry,
                    ResponseDescription = res.Data.ResponseDescription,
                    ResponseMessage = res.Data.ResponseMessage
                };
                return BalanceInquiryResponse;
            }
            else
            {
                BalanceInquiryResponse = new BalanceInquiryResponse
                {               
                    ResponseDescription = responseses.ErrorMessage,             
                };
                return BalanceInquiryResponse;
            }
        }

  

Это тело моего ответа

 {
  "responseMessage": "Successful",
  "responseDescription": "Request Successful",
  "responseInquiry": null
}

  

Когда я попытался с postman, я получил

 {
    "ResponseMessage": "Successful",
    "ResponseDescription": "Request Successful",
    "response": {
        "AvalBal": 586324.42,
        "ReverAmt": 0,
        "AccCurrency": "US "
    }
}
  

Комментарии:

1. каков ваш код http-статуса возврата / ответа?

2. Я получил 200 ответов в моем пользовательском интерфейсе swagger

3. Если вы получили 200 (и вы получили «подсказку» об «ResponseMessage»: «Успешно»,)……. тогда технически это «работает». Вам необходимо проверить на стороне сервера, произошло ли что-нибудь с вашими данными POST. Если responseInquiry равен null, то это может быть «нормальным». Предоставляет ли rest-сервис документацию по ожидаемым входам / выходам (запросам / ответам).

4. Я обновил свой вопрос, чтобы увидеть ответ, который я получил от postman

5. Хорошо, теперь я вижу дилемму….

Ответ №1:

 IRestResponse<BalanceInquiryResponse> res = client.Execute<BalanceInquiryResponse>(request);
  

Итак, есть конкретная причина…вы помещаете BalanceInquiryResponse в общий IRestResponse, приведенный выше.

С помощью вышеупомянутого вызова это должно автоматически увлажнить объект BalanceInquiryResponse, и вам не нужно будет передавать map.

Иначе говоря, вам ~ не ~ должен понадобиться этот приведенный ниже код:

             BalanceInquiryResponse = new BalanceInquiryResponse
            {
                responseInquiry = res.Data.responseInquiry,
                ResponseDescription = res.Data.ResponseDescription,
                ResponseMessage = res.Data.ResponseMessage
            };
  

Я думаю, ваша проблема в том, что ваш объект POCO (BalanceInquiryResponse) должен идеально соответствовать «структуре» JSON.

Измените свой BalanceInquiryResponse, чтобы он ИДЕАЛЬНО соответствовал «свойствам» json.

и распознает, что у вас есть вложенный объект.

Я думаю, что это было бы:

 public class ResponsePoco    {
    public double AvalBal { get; set; } 
    public int ReverAmt { get; set; } 
    public string AccCurrency { get; set; } 
}

public class BalanceInquiryResponse{
    public string ResponseMessage { get; set; } 
    public string ResponseDescription { get; set; } 
    public ResponsePoco response { get; set; } 
}
  

Обратите внимание на «ResponsePoco response» .. обратите внимание, что имя переменной в нижнем РЕГИСТРЕ .. потому что … в json есть строчный «response».
Я вызвал (дочерний) объект «ResponsePoco», чтобы выделить разницу между именем объекта и именем переменной.

Если вы не можете «идеально» соответствовать свойствам Poco. вы можете использовать атрибуты, чтобы «массировать» несоответствия. Как видно здесь:

https://www.newtonsoft.com/json/help/html/JsonPropertyName.htm

 public class Videogame
{
    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("release_date")]
    public DateTime ReleaseDate { get; set; }
}
  

Комментарии:

1. Вы абсолютно правы. Я внес изменения в объект ответа