2012-12-17 16 views
7

Jestem początkujący w usługach RESTful.Jak przekazać i skonsumować parametr JSON do/z usługą RESTful WCF?

Potrzebuję utworzyć interfejs, w którym klient musi przekazać do 9 parametrów.

Wolałbym przekazać parametry jako obiekt JSON.

Na przykład, jeśli mój JSON jest:

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

A jeśli muszę wykonać metodę stronie serwera poniżej w końcu:

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

pytanie (s):
Jak powinienem wykonać wywołanie od strony klienta z powyższym ciągiem JSON? i jak mogę utworzyć podpis i wdrożenie relaksującego metody usługi, które

  • akceptuje tego JSON,
  • analizuje i deserializes go do obiektu osoba i
  • połączeń/zwraca wartości zwracanej metoda FindPerson z powrotem do klient?
+0

Zobacz http://stackoverflow.com/questions/13165533/deserialize-json-object-sent-from-android-app-to-wcf-webservice –

+0

Jaki język używasz wezwać serwis? JavaScript, C#, coś jeszcze? – carlosfigueira

Odpowiedz

9

Jeśli chcesz utworzyć operację WCF do odbioru tego wejścia JSON, musisz zdefiniować umowę danych, która mapuje do tego wejścia. Istnieje kilka narzędzi, które robią to automatycznie, w tym jeden, który napisałem jakiś czas temu pod numerem http://jsontodatacontract.azurewebsites.net/ (więcej szczegółów na temat tego, jak to narzędzie zostało napisane pod this blog post). Narzędzie generowane tej klasy, które można użyć:

// 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; 
} 

Następnie trzeba zdefiniować umowę pracy do otrzymania tego. Ponieważ JSON musi wejść w treść żądania, najbardziej naturalną metodą HTTP jest POST, więc możesz zdefiniować operację jak poniżej: metoda "POST" i styl "Bare" (co oznacza, że JSON mapuje bezpośrednio do parametru). Zauważ, że możesz nawet pominąć właściwości Method i BodyStyle, ponieważ wartości domyślne to "POST" i 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; 
} 

Teraz, w metodzie masz wejście mapowane na lookupPerson. Sposób, w jaki wdrożysz logikę swojej metody, zależy od Ciebie.

Aktualizacja po komentarzu

Jednym z przykładów wywoływania usługi przy użyciu JavaScript (przez jQuery) można znaleźć poniżej.

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)); 
    } 
}); 
+0

Bardzo przydatna odpowiedź carlosfigueira! (Możesz również dodać wywołanie Javascript, aby z grubsza objąć wszystkie części) Dzięki! – pencilCake

+0

Zapytałem, jak zastąpić to wywołanie ajax jquery za pomocą wbudowanego JavaScriptu funkcji tylko :) (Zobacz moje ostatnie pytanie, jeśli zainteresowane :)) – pencilCake

+0

Próbka na http://msdn.microsoft.com/en-us/library /vstudio/bb472488(v=vs.100).aspx pokazuje jeden sposób na to, używając obiektu 'XMLHttpRequest'. – carlosfigueira

1

1-Dodaj atrybut 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-Zastosowanie NewtonSoft do serializacji/deserializacji swoją json do swojego przedmiotu (uwaga wyżej zajmuje tylko w łańcuchach), NewtonSoft jest znacznie szybsze niż MS serializatora .

użycie NewtonSoft dla serializacji http://json.codeplex.com/

3- plik .svc będzie zawierać Fabrycznie = "System.ServiceModel.Activation.WebServiceHostFactory

4- Twój web.config będzie zawierać

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

... i ...

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 
+1

Jeśli chcesz przekazać dane wejściowe JSON do usługi WCF, nie powinieneś używać '[WebGet]' - dane wejściowe powinny być przekazywane w treści żądania, więc GET nie powinien być używany do tego. Zamiast tego powinien użyć '[WebInvoke]'. – carlosfigueira