2011-01-04 2 views
2

У меня есть RESTful службы WCF с помощью метода объявлен как это:Как вызвать метод службы RESTful WCF с несколькими параметрами?

[OperationContract(Name = "IncrementAge")] 
[WebInvoke(UriTemplate = "/", Method = "POST", ResponseFormat = WebMessageFormat.Json)] 
Person IncrementAge(Person p); 

Вот реализация:

public Person IncrementAge(Person p) 
{ 
      p.age++; 

      return p; 
} 

Так он принимает сложный тип Person, увеличивает свойство возраст одного и косами обратно, используя сериализацию JSON. Я могу проверить это, отправив сообщение POST на эту услугу:

POST http://localhost:3602/RestService.svc/ HTTP/1.1 
Host: localhost:3602 
User-Agent: Fiddler 
Content-Type: application/json 
Content-Length: 51 

{"age":25,"firstName":"Hejhaj","surName":"Csuhaj"} 

Это работает. Что делать, если я хотел бы иметь такой метод?

Person IncrementAge(Person p, int amount); 

Таким образом, у него будет несколько параметров. Как мне создать сообщение POST для этого? Это возможно?

Благодаря

ответ

3

Вы можете использовать параметр строки запроса,

POST /RestService.svc/Incrementor?amount=23 
{...} 

Я думаю, что подпись WCF будет:

[OperationContract(Name = "IncrementAge")] 
[WebInvoke(UriTemplate = "/?amount={amount}", Method = "POST", ResponseFormat = WebMessageFormat.Json)] 
Person IncrementAge(int amount, Person p); 
+0

Использование параметра запроса для передачи аргумента *, действовавшего на * в запросе POST, кажется мне немного странным. Я бы зарезервировал параметры запроса для * выбора * ресурсов (для получения или обновления), а не для фактического * изменения * ресурсов. – kpozin

+0

@kpozin Почему? Является ли намерение непонятным? –

+0

Проблема заключается в том, что IncrementAge возвращает Person, поэтому он граничит с GET (т. Е. Запрашивает конкретное представление ресурса). Несмотря на то, что метод больше связан с вызовом RPC ... – AshesToAshes

8

Вы должны сделать стиль тела сообщения обернутый так что вы можете принимать несколько аргументов в теле запроса POST.

Ваш метод подписи будет:

[OperationContract(Name = "IncrementAge")] 
[WebInvoke(UriTemplate = "/", Method = "POST", 
      ResponseFormat = WebMessageFormat.Json, 
      BodyStyle = WebMessageBodyStyle.WrappedRequest)] 
Person IncrementAge(Person p, int amount); 

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

{"p": {"age":25,"firstName":"Hejhaj","surName":"Csuhaj"}, "amount": 1} 

Внешний объект JSON является анонимным оболочкой.

Смежные вопросы