#javascript #c# #asp.net-core #axios #asp.net-core-webapi
Вопрос:
У меня есть этот простой вызов Axios:
var payload = "this is a test";
const dt = { rockText: payload };
const request = axios.put(`/api/rocks/${rockId}/rockText`, dt);
Он подключается к контроллеру, подобному этому:
[HttpPut("{id}/rockText")]
public IActionResult PutRockText(Int32 id, [FromBody] string rockText)
{ ... }
Но rockText
всегда имеет значение null в контроллере, хотя я знаю, что это не так, когда используется Axios.
Я перепробовал так много вариантов вызова Axios, но он всегда равен нулю.
Как я могу заставить это работать?
Комментарии:
1. С какой стороны проблема — работает ли запрос от другого клиента?
2. @jonrsharpe У меня сейчас только один клиент
3. Почтальон, завиток,
fetch
в твоем браузере,…? Вам нужно выполнить некоторую базовую отладку, чтобы вы знали, нужно ли исправлять отправку или получение запроса.4. @jonrsharpe извините, я понимаю, что вы имеете в виду. Я попробовал это через почтальона, и он также был пустым со стороны api.
5. @jonrsharpe, но
id
, тем не менее, все в порядке. :/
Ответ №1:
Если вы хотите передавать данные json с помощью axios,вам нужно установить Content-Type
,вот демонстрационная версия:
axios(я использую 1 для замены ${rockId}
для тестирования):
var payload = "this is a test";
const request = axios.put(`/api/rocks/1/rockText`, JSON.stringify(payload),
{ headers: { 'Content-Type': 'application/json' } });
Контроллер:
[HttpPut("{id}/rockText")]
public IActionResult PutRockText(int id,[FromBody]string rock)
{
return Ok();
}
Ответ №2:
Проблема в том, что связующее устройство модели не может разрешить полезную нагрузку. Причина в том, что он ожидает строку, но на самом деле вы передаете объект json со свойством rockText
.
Я бы создал класс для представления json, который вы отправляете:
public class Rock
{
public string RockText { get; set; }
}
[HttpPut("{id}/rockText")]
public IActionResult PutRockText(Int32 id, [FromBody] Rock rock)
{ ... }
В качестве альтернативы вы можете попробовать передать строку из axios:
var payload = "this is a test";
const request = axios.put(`/api/rocks/${rockId}/rockText`, payload);
Комментарии:
1. Спасибо, я изменил его на ваш 2-й пример, но он по-прежнему равен нулю… однако Рокид проходит нормально
2. @SkyeBoniwell ты попробовал мое первое предложение? Это то, что я бы рекомендовал
3. Я только что сделал, но он по-прежнему равен нулю 🙁
4. Я протестировал, и это работает для меня с помощью postman, вам нужно будет предоставить более подробную информацию об отладке @SkyeBoniwell