Формат тела веб-службы RESTful

Я новичок в WCF. Я делаю несколько простых контрактов на работу с RESTful WCF. И у меня есть вопрос о вариантах для свойства «BodyStyle» classа атрибутов «WebInvoke». Один из вариантов – WebMessageBodyStyle.Bare, а другой – WebMessageBodyStyle.Wrapped. Когда следует использовать Bare? Когда следует использовать Wrapped?

Спасибо за помощь.

2 Solutions collect form web for “Формат тела веб-службы RESTful”

Предположим, что у вас есть контракт с XML-запросом / ответом и некоторым простым контрактом на передачу данных:

[ServiceContract] public interface IService { ... [OperationContract] [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)] Entity DoWork(Entity entity); ... } [DataContract] public class Entity { [DataMember] public string Name; [DataMember] public string Value; } 

В зависимости от комбинации BodyStyle , RequestFormat и ResponseFormat вас будут разные форматы, но в целом:

JSON и WebMessageBodyStyle.Bare Запрос и ответ будут следующими:

Запрос:

 {"Name":"name","Value":"value"} 

Отклик:

 {"Name":"ResultName:name","Value":"ResultValue:value"} 

JSON и WebMessageBodyStyle.Wrapped запрос и ответ будут следующими:

Запрос:

 {"entity":{"Name":"name","Value":"value"}} 

Отклик:

 {"DoWorkResult":{"Name":"name","Value":"value"}} 

Примечание . Вы можете изменить имя DoWorkResult умолчанию:

 [return: MessageParameter(Name = "MyResult")] Entity DoWork(Entity entity);` 

так что теперь это будет:

 {"MyResult":{"Name":"name","Value":"value"}} 

XML и WebMessageBodyStyle.Bare запрос и ответ будут:

Запрос:

  name value  

Отклик:

  name value  

XML и WebMessageBodyStyle.Wrapped запрос и ответ будут:

Запрос:

    name value   

Отклик:

    name value   

Примечание : вы также можете изменить имя DoWorkResult умолчанию с return: MessageParameter

Чтобы ответить на ваш вопрос, который должен использовать WebMessageBodyStyle , зависит от ваших потребностей, и здесь нет золотого правила. Для обеспечения совместимости иногда может потребоваться тот или иной формат. Но имейте в виду об одном ограничении стиля голого тела: поскольку в формате XML есть только один корень и один объект в формате JSON, только один параметр может быть передан методу. Фактически, если вы изменили контракт на обслуживание на что-то вроде:

 [OperationContract] [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)] Entity DoWork(string id, Entity entity); 

служба будет генерировать исключение:

Операция ” контракта ” задает несколько параметров тела запроса, которые должны быть сериализованы без каких-либо элементов-оберток. Не более одного параметра тела можно сериализовать без элементов обертки. Удалите дополнительные параметры тела или установите свойство BodyStyle в атрибуте WebGetAttribute / WebInvokeAttribute для обертывания.

Использование обернутого в описании операции просто переносит запрос (или ответ) в элемент XML. Например, в этом контракте:

 [ServiceContract] public interface ITest { [OperationContract] [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare)] string Echo(string text); [OperationContract] [WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)] string EchoWrapped(string text); [OperationContract] [WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)] int Divide(int dividend, int divisor, out int reminder); } 

Вход для операции Echo – это просто элемент с текстом, содержащимся внутри. Аналогично, его ответ содержит один элемент с возвратом операции. Для операции EchoWrapped вход представляет собой элемент, чей дочерний элемент является элементом, дочерний элемент которого содержит вход для метода.

Что ожидает сервис Echo:

 The input 

Что ожидает сервис EchoWrapped:

 Hello wrapped 

Источник: http://social.msdn.microsoft.com/Forums/vstudio/en-US/9db6793b-8db9-479b-825c-e781d023f6c1/bodystylewebmessagebodystylewrapped-with-requestformatwebmessageformatxml-for-post?forum=wcf

Interesting Posts

Как получить указатель интерфейса JNI (JNIEnv *) для асинхронных вызовов

Почему Apple отказывается от OpenSSL в MacOS 10.7 (Lion)?

Какое приложение можно использовать для синхронизации нескольких устройств?

Xcode 4 – ошибка «Недействительность подлинного подписи не найдена» при настройке профилей при установке нового Macintosh

Как восстановить Windows 7 после сырой установки Ubuntu?

MediaRecorder и VideoSource.SURFACE, остановка не удалось: -1007 (серьезная ошибка Android)

В чем причина невозможности сохранения Fillable PDF?

Отладчик JavaScript

Метаданные не были загружены с использованием MetadataType

Настройки удаленного рабочего стола отсутствуют

Дизайн API Rails без отключения защиты CSRF

Android – ListView – performItemClick

Требуется Gradle версия 1.10. Текущая версия 2.0

API Google Map – удаление маркеров

Фильтрация нескольких значений в столбце строки в dplyr

Давайте будем гением компьютера.