.Net Core Web API не принимает значение строкового поля json - PullRequest
0 голосов
/ 23 мая 2018

У меня есть проблема, из-за которой я хотел бы передать строку json в качестве значения поля, но я продолжаю получать "The input was not valid".Чтобы было ясно, у меня есть объект в моем интерфейсе, который я использую ниже, чтобы перейти к моему API:

let j: Settings = {} as Settings;
j.user_settings_ID = object.user_settings_ID;
j.user_ID = object.user_ID;
j.user_filter = JSON.stringify(object.user_filter);
j.user_test_filter = JSON.stringify(object.user_test_filter);

fetch('api/Profile/UpdateProfileSettings/?id=' + object.user_settings_ID, {
    method: 'put',
    headers: {
        'Content-Type': 'application/json; charset=utf-8',
        'Authorization': 'Bearer ' + sessionStorage.getItem('token')
    },
    body: "'" + JSON.stringify(j) + "'",
}).then(data => {
    if (!data.ok) {
        alert("Failed");
    }           
}).catch((ex) => {
    alert("Failed");
});

В моем API у меня есть:

[HttpPut("[action]")]
public async Task<string> UpdateProfileSettings(int id, [FromBody] string obj)
{
    HttpClient clientRoute = new HttpClient();

    var response = await clientRoute.PutAsync("https://something.com/api/UserSettings/put/" + id, new StringContent(obj, Encoding.UTF8, "application/json"));
    var contents = await response.Content.ReadAsStringAsync();

    return contents;
}

Я неУ меня нет проблем, когда я задаю j.user_filter и j.user_test_filter с любой нормальной строкой, но я хотел бы поместить строку 'jsonified' в качестве значения для поля, но Web API по каким-то причинам не нравится(возможно, потому что он не видит его как строку, а может быть объектом json)

Если кто-то может помочь, я был бы очень признателен.

Ответы [ 2 ]

0 голосов
/ 07 августа 2018

Это очень похоже на собственное исправление mcc20, но я не получил этот код для работы.Платформа 2.1 имеет проблемы https://github.com/aspnet/Mvc/issues/7609 и https://github.com/aspnet/Mvc/issues/7799. Я получил этот пост JSON для сложного класса, работающего в 2.1: клиентский JavaScript не изменился:

var payload = JSON.stringify({ "name": document.getElementById('firstname').value, "email": document.getElementById('email').value, "captcha": grecaptcha.getResponse() });
var oReq = new XMLHttpRequest();
oReq.ContentType = "application/json";

oReq.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {

        document.getElementById("update").innerHTML = this.responseText;
    }
    else document.getElementById("update").innerHTML = "not 4&200! : " + this.responseText;
};

oReq.open('POST', 'api/u');
oReq.send(payload);

, а контроллер имеет:

[Route("api/[controller]")]
//  [ApiController] // works either way
public class UController : ControllerBase
{
    [HttpPost]
    public async Task<string> signUp()
    {
        String body;
        using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
        {
            body = await reader.ReadToEndAsync();
        }

        UserSignup user = JsonConvert.DeserializeObject<UserSignup>(body);

        return user.email;
    }
}

Я пытался что-то вроде ([FromBody] UserSignup user), получая Mvc.SerializableError и "Ввод был неверным".Скоро будет на https://github.com/Hover-Us/

0 голосов
/ 23 мая 2018

Хорошо, после того, как долго возился с этим, я придумал это «решение».

Так как @Niladri указал на «» перед JSON.stringify (j) был фактором, нобыло не единственной вещью, которую нужно было изменить.Основная проблема была на самом деле в самом контроллере.

У меня было это ранее в моем контроллере:

        public async Task<string> UpdateProfileSettings(int id,[FromBody] string obj)
    {

        HttpClient clientRoute = new HttpClient();

        var response = await clientRoute.PutAsync("https://something.com/api/UserSettings/put/" + id, new StringContent(obj, Encoding.UTF8, "application/json"));
        var contents = await response.Content.ReadAsStringAsync();

        return contents;
    }

Но мне пришлось изменить его на:

       public async Task<string> UpdateProfileSettings(int id,[FromBody] object obj)
    {

        HttpClient clientRoute = new HttpClient();

        var response = await clientRoute.PutAsync("https://something.com/api/UserSettings/put/" + id, new StringContent(obj.ToString(), Encoding.UTF8, "application/json"));
        var contents = await response.Content.ReadAsStringAsync();

        return contents;
    }

Обратите внимание на изменение [FromBody] string obj на [FromBody] object obj, а также на StringContent(obj, Encoding.UTF8, "application/json")) на StringContent(obj.ToString(), Encoding.UTF8, "application/json"))

Мой предыдущий метод с «» до JSON.stringify (j) работает, если ваш контроллер [FromBody] имеетстроковый тип, и вы не хотите закачивать в контроллер строку, похожую на JSON.

Я прошу прощения, если это плохое объяснение, но старался изо всех сил, и это сработало для меня

...