Как передать и использовать параметр JSON в/с службой RESTful WCF?

Я новичок в RESTful сервисах.

Мне нужно создать интерфейс, в котором клиенту нужно передать до 9 параметров.

Я бы предпочел передать параметры как объект JSON.

Например, если мой JSON:

'{
    "age":100,
    "name":"foo",
    "messages":["msg 1","msg 2","msg 3"],
    "favoriteColor" : "blue",
    "petName" : "Godzilla",
    "IQ" : "QuiteLow"
}'

И если мне нужно выполнить метод на стороне сервера ниже, в конце:

public Person FindPerson(Peron lookUpPerson)
{
Person found = null;
// Implementation that finds the Person and sets 'found'
return found;
}

Вопрос(ы):
Как мне сделать вызов со стороны клиента с помощью приведенной выше строки JSON? И как я могу создать подпись и реализацию метода службы RESTful, который

  • принимает этот JSON,
  • анализирует и десериализует его в объект Person и
  • вызывает/возвращает возвращаемое значение метода FindPerson обратно клиенту?

person pencilCake    schedule 17.12.2012    source источник
comment
См. stackoverflow.com/questions/13165533/   -  person L.B    schedule 17.12.2012
comment
На каком языке вы звоните в службу? JavaScript, C#, что-то еще?   -  person carlosfigueira    schedule 18.12.2012


Ответы (2)


Если вы хотите создать операцию WCF для получения этого ввода JSON, вам необходимо определить контракт данных, который сопоставляется с этим вводом. Есть несколько инструментов, которые делают это автоматически, в том числе один, который я недавно написал на http://jsontodatacontract.azurewebsites.net/ (подробнее о том, как был написан этот инструмент, см. на странице этой записи в блоге). Инструмент сгенерировал этот класс, который вы можете использовать:

// Type created for JSON at <<root>>
[System.Runtime.Serialization.DataContractAttribute()]
public partial class Person
{

    [System.Runtime.Serialization.DataMemberAttribute()]
    public int age;

    [System.Runtime.Serialization.DataMemberAttribute()]
    public string name;

    [System.Runtime.Serialization.DataMemberAttribute()]
    public string[] messages;

    [System.Runtime.Serialization.DataMemberAttribute()]
    public string favoriteColor;

    [System.Runtime.Serialization.DataMemberAttribute()]
    public string petName;

    [System.Runtime.Serialization.DataMemberAttribute()]
    public string IQ;
}

Затем вам нужно определить контракт операции, чтобы получить это. Поскольку JSON должен идти в теле запроса, наиболее естественным для использования методом HTTP является POST, поэтому вы можете определить операцию, как показано ниже: метод «POST» и стиль «Bare» (что означает, что ваш JSON сопоставляется непосредственно с параметром). Обратите внимание, что вы даже можете опустить свойства Method и BodyStyle, поскольку "POST" и WebMessageBodyStyle.Bare являются их значениями по умолчанию соответственно).

[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Bare)]
public Person FindPerson(Peron lookUpPerson)
{
    Person found = null;
    // Implementation that finds the Person and sets 'found'
    return found;
}

Теперь в методе у вас есть ввод, сопоставленный с lookupPerson. Как вы будете реализовывать логику вашего метода, зависит от вас.

Обновить после комментария

Один из примеров вызова службы с помощью JavaScript (через jQuery) можно найти ниже.

var input = '{
    "age":100,
    "name":"foo",
    "messages":["msg 1","msg 2","msg 3"],
    "favoriteColor" : "blue",
    "petName" : "Godzilla",
    "IQ" : "QuiteLow"
}';
var endpointAddress = "http://your.server.com/app/service.svc";
var url = endpointAddress + "/FindPerson";
$.ajax({
    type: 'POST',
    url: url,
    contentType: 'application/json',
    data: input,
    success: function(result) {
        alert(JSON.stringify(result));
    }
});
person carlosfigueira    schedule 17.12.2012
comment
Очень полезный ответ, carlosfigueira! (Можете ли вы также добавить вызов Javascript, чтобы он мог примерно охватить все части) Спасибо! - person pencilCake; 18.12.2012
comment
Я спросил, как заменить этот jquery ajax-вызов только использованием встроенных функций JavaScript :) (см. мой последний вопрос, если интересно :)) - person pencilCake; 18.12.2012
comment
Пример на msdn.microsoft.com/ en-us/library/vstudio/ показывает один из способов сделать это, используя объект XMLHttpRequest. - person carlosfigueira; 18.12.2012
comment
WebMessageBodyStyle.WrappedRequest может помочь вам, если Bare вызывает ошибку. - person nasch; 02.12.2017

1-Добавьте атрибут WebGet

<OperationContract()> _
        <WebGet(UriTemplate:="YourFunc?inpt={inpt}", BodyStyle:=WebMessageBodyStyle.Wrapped,
                RequestFormat:=WebMessageFormat.Json, ResponseFormat:=WebMessageFormat.Xml)> _
        Public Function YourFunch(inpt As String) As String

2-Используйте NewtonSoft для сериализации/десериализации вашего json в ваш объект (обратите внимание, что приведенное выше просто принимает строку), NewtonSoft намного быстрее, чем сериализатор MS.

используйте NewtonSoft для сериализации http://json.codeplex.com/

3- ваш файл .svc будет содержать Factory="System.ServiceModel.Activation.WebServiceHostFactory

4- ваш web.config будет содержать

     <behaviors>
      <endpointBehaviors>
        <behavior name="webHttpBehavior">
          <webHttp />
        </behavior>
      </endpointBehaviors>
    </behaviors>

...и...

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
person lcryder    schedule 17.12.2012
comment
Если вы хотите передать ввод JSON в службу WCF, вам не следует использовать [WebGet] — ввод должен быть передан в теле запроса, поэтому для этого не следует использовать GET. Вместо этого следует использовать [WebInvoke]. - person carlosfigueira; 18.12.2012