Веб-сервис.

Как для GET метода передать кастомный тип объекта во входных параметрах?

Есть тип:

    [DataContract]

    public class SomeType {

        [DataMember]

        public string path { get; set; }

        [DataMember]

        public string als { get; set; }

    }




Есть метод: 

[OperationContract]

        [WebInvoke(Method = "GET", 

            RequestFormat = WebMessageFormat.Json, 

            BodyStyle = WebMessageBodyStyle.Wrapped,

            ResponseFormat = WebMessageFormat.Json,

            UriTemplate = "/ping/{s}")]

            [return: MessageParameter(Name = "data")]

        public object Pong(string s, SomeType SomeData) {

            return JsonConvert.SerializeObject(SomeData);

        }

При попытке отправить гет запрос через постман и передать данные, получаем всегда ответ: 



"data": "{\"path\":null,\"als\":null}

 

Что по факту равно если вообще не передавать параметр.



Но если мы делаем метод POST и передаем в теле этот же параметр вот так:

{

    "SomeData":  {

        "path": "Name",

        "als": "name"

    }

}

 

То работает, чего я не понимаю? 

Нравится

5 комментариев

Я не помню, что бы в get запросе можно было передавать тело запроса анонимно,  для такого метод post предназначен, а get данные через параметры в url всегда передаются.

можно попробовать принять json из урла , сделав так, но это уже извращение

`?someBody={key:"value"}`? 

Dima Avdoshin,

тело запроса это же просто данные, какая разница что передавать данные если их конечно не много через гет или через пост? особенно если ты хочешь только читать данные

Dima Avdoshin,

вопрос в тому как передать в гет запросе данные так что бы это потому преобразовалось в объект, потому как с List<Guid>  передается и все норм, я вот думаю в чем разница между Guid и моими типами? скрин приложу как передаю

ответ: 

{

    "data": "{\"path\":null,\"als\":null}[\"c31b1382-d7c1-4318-a241-16a64c825720\"]sasdasdasd"

}

Стас Гаврилюк,

к сожалению я не смог сделать так как ты, вероятно может получится с помощью класса обертки (код ниже), где в knowType указываются все возвращаемые типы, можешь назвать его как указано ниже

 

[DataContract]
[KnownType(typeof(OpenIdStatus))]
[KnownType(typeof(string))]
public class ReturnValue
{
    [DataMember]
    public object Value { get; set; }
}

также для меня работало следующее

/ping/12?someObj='{"path":"dsadsadas","als":"dsadsadasdsadasdasdsa"}'

тоже самое и с обжектом работает

[OperationContract]
        [WebInvoke(Method = "GET", 
            RequestFormat = WebMessageFormat.Json, 
            BodyStyle = WebMessageBodyStyle.Wrapped,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/ping/{s}?someObj={SomeData}")]
            [return: MessageParameter(Name = "data")]
        public dynamic  Pong(string s, dynamic SomeData) {
            return JsonConvert.DeserializeObject(SomeData);
        }

 

параметр ввиде объекта определенного типа не принимает , не смог нагуглить почему, пишет , что 

>Операция &quot;Pong&quot; в контракте &quot;WebService1C&quot; содержит переменную запроса с именем

        &quot;SomeData&quot; и типом &quot;Terrasoft.Configuration.SomeType&quot;, но тип

        &quot;Terrasoft.Configuration.SomeType&quot; не является преобразуемым посредством

        &quot;QueryStringConverter&quot;. Переменные для переменных запроса UriTemplate должны иметь типы, которые могут

        преобразовываться при помощи &quot;QueryStringConverter&quot;.

Вероятно тут дело в самой сути GET POST запросов. Если вариант предложенный Дмитрием не сработает, то тут останется только использовать POST запрос.

Показать все комментарии