WebAPI: передача массива объектов с использованием запроса POST AJAX (axios) - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь передать данные в маршрут WebAPI, но он не является обязательным - полученный параметр всегда равен нулю.

На внешнем интерфейсе у меня есть массив заданий, подобных этому:

const jobs = [{Id: 1, Name: 'First'}, {Id: 2, Name: 'Second'}] 

Я пытаюсь передать этот массив бэкэнду, используя запрос post:

axios.post('jobs/insert', jobs, {
  headers: { 'Content-Type': 'application/json' }
})

Это результирующий необработанный запрос:

POST /api/job/insert HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 51
Accept: application/json
Origin: http://localhost:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
DNT: 1
Content-Type: application/json
Referer: http://localhost:8080/
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,fr;q=0.

[{"Id":1,"Name":"First"},{"Id":2,"Name":"Second"}] 

На внутренней стороне у меня есть этот метод:

[HttpPost]
[Route("insert")]
public IActionResult InsertJob([FromBody] List<dto.Job> jobs)
{
    return this.Ok(new { data = jobs });
}

Метод вызывается правильно, но jobs не связывает правильно - всегда имеет значение null.

Это модель dto.Job:

namespace Scheduling.Models.DTO
{   
    public class Job
    {
        public int Id { get; set; }

        public string Name { get; set; }
    }
}

Я пытался использовать List<dto.Job>, dto.Job[], IEnumerable<dto.Job>.Я также попытался удалить [FromBody] или опубликовать объект {'': jobs} вместо массива (как предлагается на других веб-сайтах).Кажется, ничего не работает, по какой-то причине полученные данные всегда равны нулю.

Я что-то делаю неправильно?

1 Ответ

0 голосов
/ 05 февраля 2019

Если вы посмотрите на тело запроса, массив не будет строковым json

Это

[{"Id":1,"Name":"First"},{"Id":2,"Name":"Second"}] 

Должно быть

"[{"Id":1,"Name":"First"},{"Id":2,"Name":"Second"}]"

В запросе axios попробуйтеи зафиксируйте объект перед отправкой

axios.post('jobs/insert', JSON.stringify(jobs), {
  headers: { 'Content-Type': 'application/json' }
})
...