Почтальон не может установить значения параметра словаря для веб-API C # - PullRequest
0 голосов
/ 21 декабря 2018

Ниже приведен код, написанный для проверки на чтение ключа словаря и значений из Почтальона.

Метод веб-API C #:

[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "Service/testdictionary",
BodyStyle = WebMessageBodyStyle.WrappedRequest)]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public void testdictionary(Dictionary<string,object> data)
{
if(data != null)
{
string str1 = data["a1"].ToString();
string str2 = data["a2"].ToString();
string str3 = data["a3"].ToString();
}
}

Тело ввода Почтальона: (raw и JSON (приложение)/ json))

{
"data": {
"a1": "b1",
"a2": "b2",
"a3": "b3"
}
}

Как я вызываю метод из Почтальона:

Postman Call

В чем проблема: Всякий раз, когда я пытаюсь назначить объект словаряданные от почтальона, в коде C # он присваивается как пустой словарь.

Что требуется: я хочу прочитать элемент словаря из почтальона в мой код API.

Ответы [ 4 ]

0 голосов
/ 20 июля 2019

В моем случае это работало в этом формате ActionParam = [{Key: 'orderId', Value: '200'}];«ActionParam» - это свойство словаря в модели, также протестированное в WCF.

0 голосов
/ 22 декабря 2018

Попробуйте это.

Я пытался!все работает отлично.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace StackOverFlowProblemWebApi.Controllers
{
    public class TestController : ApiController
    {
        [HttpPost]
        public IHttpActionResult TestDictionary([FromBody]Dictionary<string,object> data)
        {
            if (data != null)
            {
                string string1 = data["a1"].ToString();
                string string2 = data["a2"].ToString();
                string string3 = data["a3"].ToString();

                return Ok("Data Recieved."); // When the data is successfully recieved.
            }
            else
                return BadRequest("Data is not received.");
        }
    }
}

enter image description here

Смотри!Вы видели, что: данные получены....

0 голосов
/ 23 декабря 2018

Мне удалось решить мою проблему как обходной путь, можно сказать, словарь подобного типа.

Каково решение: использовать объект класса вместо словаря.

ВотМое решение:

Я добавляю класс, похожий на структуру словаря, который я хотел. (Единственное, что мне нужно, это кодировать дополнительную строку кода, чтобы объявить класс с помощью ключей, которых я раньше избегал)

Вот мой код из веб-API:

    public class mydictionary
    {
        public string a1 { get; set; }
        public string a2 { get; set; }
        public string a3 { get; set; }
    }

    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "Service/testdictionary",
    BodyStyle = WebMessageBodyStyle.WrappedRequest)]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public string testdictionary(mydictionary data)
    {
        if (data != null)
        {
            string str1 = data.a1.ToString();
            string str2 = data.a2.ToString();
            string str3 = data.a3.ToString();
            return "success".ToString();
        }
       else
        {
            return "unsuccess".ToString();
        }

    }

Вот мой вход и выход почтальона: Снимок экрана почтальона

0 голосов
/ 22 декабря 2018

Ваши предметы не data["a1"], data["a2"] и т. Д. У вас есть словарь ОДНОГО предмета, ключ которого - «данные», поэтому это data["data"].Ваше значение для этого одного предмета - это объект со свойствами a1, a2 и a3.Не знаю, с чем это работает в вашем приложении WCF, но в Web API это JToken из библиотеки Newtonsoft Json.Net.

Если вам нужен Dictionary с ключами a1, a2, a3, вынеобходимо настроить тело JSON, чтобы исключить уровень «данных»:

{
"a1": "b1",
"a2": "b2",
"a3": "b3"
}

ОБНОВЛЕНИЕ

Если по какой-либо причине вам не удастся изменить структуру JSON, выможет создать класс со свойством data типа Dictionary<string,object>:

public class TheData
{
    public Dictionary<string, object> data {get;set;}
}

Тогда ваш метод API будет принимать тип TheData вместо Dictionary<string,object>:

public void testdictionary(TheData _data)
{
    ...

и ваш код будет иметь доступ к словарю как:

string d1 = _data.data["a1"].ToString(); // d1 == "b1" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...