Отправка JSON данных в API через Ajax ошибку и JSON проблему прохождения данных - PullRequest
0 голосов
/ 12 февраля 2020
var data = {
        "ApplicationName": "Zadmin",
        "KanMainGroupList":
            [{
                "MainGroupName": "Settings",
                "KanSubGroupList": [{
                    "SubGroupName": "Signatures",
                    "SubGroupURL": "Common/HHALevelSettings.aspx",
                    "SubGroupQueryString": "HHA_ID=$HHA_ID$&HHAName=$HHA_Name$",
                    "KanFeatureSetList":
                        [{
                            "FeatureName": "Client Sign pop-up",
                            "Keywords": "Client,sign"
                        }],
                    "KanNanoGroupList": [{
                        "NanoGroupName": "Nano1",
                        "NanoGroupURL": "URL1",
                        "NanoGroupQueryString": "",
                        "KanFeatureSetList": [
                            {
                                "FeatureName": "",
                                "KeyWords": ""
                            }
                        ]
                    }]
                }
                ]
            }

            ]
    };

У меня есть документ mon go с данными JSON, как указано выше. Теперь, когда я пытаюсь отправить эти данные через jquery ajax, выдается ошибка «Введен неверный формат» или какая-то синтаксическая ошибка. ajax cal выглядит следующим образом:

$.ajax({
            url: 'api/HelpAPI',
            type: 'POST',
            contentType: 'application/json',
            data: JSON.stringify(data),               
            success: function (data) {
                console.log(data);
                console.log("success");
            },
            error: function () {
                console.log("error");
            }
        }).done(function () {

        })

Контроллер выглядит следующим образом:

    [HttpPost]
    public void Post([FromBody] string value)
    {

          //i tried to use FromForm in place or FromBody
          //i tried to use object datatype for value and  dynamic as well but in object the data 
               //doesn't come and in dynamic it is very difficult to work upon.
    }

Наконец , используя метод ниже я могу получить данные правильно в значение .

    [HttpPost]
    public void Post([FromBody] KanFeatureHelp value)
    { 
        List<KanMainGroup> mainGrp = new List<KanMainGroup>();
        List<KanSubGroup> subgrp = new List<KanSubGroup>();
        List<KanNanoGroup> nanogrp = new List<KanNanoGroup>();
        List<KanFeatureSet> SubGrpfeatureset = new List<KanFeatureSet>();
        List<KanFeatureSet> NanoGrpfeatureset = new List<KanFeatureSet>();

        //mainGrp = value.KanMainGroupList;
        //subgrp = value.KanMainGroupList;

        mainGrp = value.KanMainGroupList;
        foreach(var i in mainGrp)
        {
            subgrp = i.KanSubGroupList;
            foreach (var j in subgrp)
            {
                nanogrp = j.KanNanoGroupList;
                SubGrpfeatureset = j.KanFeatureSetList;
                foreach (var k in nanogrp)
                {
                    NanoGrpfeatureset = k.KanFeatureSetList;

                }
            }
        }
    }

Структура KanFeatureHelp выглядит следующим образом:

namespace WebApplication5.Models
{
    public class KanFeatureHelp
    {
        public string ApplicationName { get; set; }
        public List<KanMainGroup> KanMainGroupList { get; set; }

    }

    public class KanMainGroup
    {
        public string MainGroupName { get; set; }
        public List<KanSubGroup> KanSubGroupList { get; set; }
    }

    public class KanSubGroup
    {
        public string SubGroupName { get; set; }
        public string SubGroupURL { get; set; }
        public string SubGroupQueryString { get; set; }
        public List<KanFeatureSet> KanFeatureSetList { get; set; }
        public List<KanNanoGroup> KanNanoGroupList { get; set; }
    }

    public class KanNanoGroup
    {
        public string NanoGroupName { get; set; }
        public string NanoGroupURL { get; set; }
        public string NanoGroupQueryString { get; set; }
        public List<KanFeatureSet> KanFeatureSetList { get; set; }
    }

    public class KanFeatureSet
    {
        public string FeatureName { get; set; }
        public string Keywords { get; set; }
    }
}

Вопросы:

  1. Что не так с моим вызовом API? Как на самом деле узнать, как настроить тип контента / манипулирование данными для правильной отправки данных? Что делать, если кто-то хочет отправить данные / объект Dynami c? как можно тогда отправить некоторые строковые данные?

  2. Возможно ли, если бы я мог отправить данные в виде строки и затем десериализовать обратно в c# код?

  3. текущая цель состоит в том, чтобы добавить или удалить любые MainGroup / SubGroup / NanoGroup / FeatureName в текущей Jsondata, которые, я считаю, должны будут проходить через данные. Если бы я мог получить некоторую информацию о том, как это сделать, это было бы очень полезно.

  4. В текущем рабочем сценарии единственным уровнем, к которому я могу получить доступ к данным, является значение . KanMainGroupList . После этого он не показывает какой-либо список подгруппы или другие данные. Это неправильная реализация? Должен ли я что-то изменить?

Действительно ценю ваше время и усилия. Большое вам спасибо.

1 Ответ

0 голосов
/ 12 февраля 2020

Что не так с моим вызовом API

Как вы уже обнаружили, это потому, что сервер ожидает полезную нагрузку application/json. Вы должны включить такой заголовок в свой запрос.

Как на самом деле узнать, как настроить тип содержимого / манипулирование данными для правильной отправки данных

Как вы знаете, наиболее часто используемые типы:

  • application/x-www-form-urlencoded: исходный тип по умолчанию при отправке формы. Это также тип по умолчанию для большинства ajax клиентов (например, XMLHttpRequest / axios / fetch /...)
  • multipart/formdata: этот тип используется, когда вы хотите отправить форму, содержащую файл. Кроме того, если вы используете FormData api , вам следует использовать тип контента.
  • application/json: поскольку JSON становится де-факто стандартной полезной нагрузкой REST , application/json довольно популярен.

ASP. NET Ядро может связывать данные из нескольких мест. Простой ASP. NET Core Controller (вместо [ApiController]) будет получать параметры из данных маршрута / строки запроса / формы, если вы не укажете [FromBody]. Однако, в отличие от простого Controller, [ApiController] будет связывать данные из тела ([FromBody]) неявно. В любом случае,

  • , если вы ожидаете полезную нагрузку json, добавьте [FromBody] на сервер. Также не забудьте добавить Content-Type: application/json в ваш запрос.
  • , если вы ожидаете форму, либо application/x-www-form-urlencoded или multipart/formdata, вы можете добавить [FromForm] на сервер и затем добавить Тип содержимого, связанный с вашим запросом.

что если кто-то захочет отправить динамические c данные / объект

Хотя я не думаю, что это хорошая идея для получения динамических c данных, если хотите, вы можете использовать dynamic.

как можно тогда отправить некоторые строковые данные?

Возможно ли, если бы я мог отправить данные в виде строки и затем десериализовать обратно в c# код

Да. Самый простой способ - использовать application/x-www-form-urlencoded для отправки полезной нагрузки, например value=the-encoded-json-string.

Или, в качестве альтернативы, если вы хотите отправить строку через application/json, см. мою ветку здесь для более подробной информации.

текущая цель добавить или удалить любую MainGroup / SubGroup / NanoGroup / FeatureName в текущей Jsondata, которая, я считаю, должна будет пройти через данные.

В текущем рабочем сценарии единственным уровнем, к которому я могу получить доступ к данным, является value.KanMainGroupList.

Я полагаю, что либо обход, либо использование LINQ сделает это. Но так как мы не знаем сценарий, мы не можем предоставить подробное предложение.

В вашей реализации нет проблем. Мое лучшее предположение, что вы хотите свободный API для доступа к подсписку? Если это так, используйте [SelectMany()](https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.selectmany?view=netframework-4.8), чтобы сгладить подгруппы.

...