Нулевое значение приходит из метода Post (FromBody), когда api вызывается из powershell - PullRequest
2 голосов
/ 15 апреля 2019

Параметр метода Post принимается равным нулю, когда API вызывается из powershell.Ниже приведен JSON

 "TestCase":{
    "tc_name":"TestCase1"
    },
    "3":{
    "scn_desc":"Create Client34345",
    "test_status":"PASS",
    "error_link":""
    }   ,
  "4":{
    "scn_desc":"Create Client43634",
    "test_status":"PASS",
    "error_link":""
    },
  "5":{
    "scn_desc":"Create Client346346",
    "test_status":"PASS",
    "error_link":""
    }   
  }

$ json , содержащий указанный выше массив json.Powershell: Invoke-WebRequest

-Uri http://localhost:65452/api/e10/e10PostTCData -Почта метода -Body $ json -ContentType 'application / json'

API:

 [Route("e10PostTCData/")]
 [HttpPost]
 public HttpResponseMessage PostResults([FromBody]JsonArray jsonArray )
 {

 }

 public class JsonArray
 {
   public string json { get; set; }
 }

Другой способ:

[Route("e10PostTCData/")]
[HttpPost]
public HttpResponseMessage PostResults([FromBody]String jsonArray )
{

}

Оба метода показывают нулевое значение в качестве параметра.Пожалуйста, сообщите.

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

В такой форме ваш сервис ожидает получения json с полем json на верхнем уровне, таким же, как ваше поле JsonArray.json класса.Таким образом, в этом случае ваше тело запроса должно выглядеть примерно так:

{
    "json": "Whatever text you need to pass here"
}

Если вы хотите передать ваше тело JSON, вам нужен класс, который имеет все те же поля, что и ваш JSON с ключами.

В противном случае вы можете прочитать ваш JSON как строку, преобразовать в JSON и обработать вручную, например:

   [Route("e10PostTCData")]
   [HttpPost]
   public async Task<string> PostResults()
   {
       var bytes = new byte[(int)Request.ContentLength.Value];
       await Request.Body.ReadAsync(bytes, 0, bytes.Length);

       var content =  Encoding.UTF8.GetString(bytes);
       var json = JObject.Parse(content);

       return json["TestCase"]["tc_name"].ToString();
   }

Для тела json:

{
    "TestCase":{
        "tc_name":"TestCase1"
    },
    "3": {
        "scn_desc":"Create Client34345",
        "test_status":"PASS",
        "error_link":""
    }   ,
    "4":{
        "scn_desc":"Create Client43634",
        "test_status":"PASS",
        "error_link":""
    },
    "5":{
        "scn_desc":"Create Client346346",
        "test_status":"PASS",
        "error_link":""
    }   
}

Ответ

TestCase1

ОБНОВЛЕНИЕ: Если вы хотите получить JSON в качестве строкового аргумента для вашей конечной точки:

    public string PostResults([FromBody]string jsonStr)
    {
        // Use JObject class methods Parse or ToObject (deserialize) your string into object
        return jsonStr;
    }

Тогда ваш запрос должен быть многострочной строкой, а НЕ JSON, чтоочень неудобно, если только вы не единственный пользователь для своей конечной точки.Например:

'{
    "TestCase":{
        "tc_name":"TestCase1"
    },
    "3": {
        "scn_desc":"Create Client34345",
        "test_status":"PASS",
        "error_link":""
    }   ,
    "4":{
        "scn_desc":"Create Client43634",
        "test_status":"PASS",
        "error_link":""
    },
    "5":{
        "scn_desc":"Create Client346346",
        "test_status":"PASS",
        "error_link":""
    }   
}'

ОБНОВЛЕНИЕ: Я не уверен во всех особенностях PowerShell, но мне помогло следующее:

> $obj='{
      "TestCase":{
          "tc_name":"TestCase1"
      }
  }'
> Invoke-WebRequest http://localhost:65452/api/e10/e10PostTCData -Body $(echo $obj | ConvertTo-Json) -Method POST -ConventType "application/json"
0 голосов
/ 16 апреля 2019

Запрос API Powershell должен быть таким, как показано ниже, если данные json отправляются в его теле:

Invoke-WebRequest-Uri http://localhost:65452/api/e10/e10PostTCData -Metod Post -Body = $ json

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...