2012-12-17 10 views
7

Sono un principiante ai servizi RESTful.Come passare e consumare un parametro JSON su/con il servizio WCF RESTful?

Ho bisogno di creare un'interfaccia in cui il client deve passare fino a 9 parametri.

Preferirei passare i parametri come oggetto JSON.

Per esempio se il mio JSON è:

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

E se ho bisogno di eseguire un metodo lato server al di sotto, alla fine:

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

Question (s):
Come dovrei effettuare la chiamata dal lato client con la stringa JSON sopra? E come posso creare una firma e l'attuazione del metodo di servizio RESTful che

  • accetta questo JSON,
  • analizza e deserializza in oggetto Person e
  • chiamate/restituisce il valore di ritorno del metodo FindPerson di nuovo a cliente?
+0

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

+0

In quale lingua stai usando per chiamare il servizio? JavaScript, C#, qualcos'altro? – carlosfigueira

risposta

9

Se si vuoi creare un'operazione WCF per ricevere quell'input JSON, dovrai definire un contratto dati che mappi a quell'input. Ci sono alcuni strumenti che lo fanno automaticamente, incluso uno che ho scritto un po 'indietro allo http://jsontodatacontract.azurewebsites.net/ (maggiori dettagli su come questo strumento è stato scritto su this blog post). Lo strumento generato questa classe, che è possibile utilizzare:

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

Successivamente, è necessario definire un contratto di operazione per riceverlo. Poiché il JSON deve essere inserito nel corpo della richiesta, il metodo HTTP più naturale da utilizzare è POST, quindi è possibile definire l'operazione come segue: il metodo è "POST" e lo stile è "Bare" (il che significa che il tuo JSON mappa direttamente al parametro). Si noti che è possibile omettere anche le proprietà Method e BodyStyle, poiché "POST" e WebMessageBodyStyle.Bare sono i rispettivi valori predefiniti, rispettivamente).

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

Ora, il metodo si ha l'ingresso mappato lookupPerson. Come implementi la logica del tuo metodo dipende da te.

Aggiornamento

dopo il commento

Un esempio di chiamare il servizio utilizzando JavaScript (tramite jQuery) si possono trovare qui di seguito.

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

Risposta molto utile carlosfigueira! (Puoi anche aggiungere la chiamata Javascript in modo che possa coprire approssimativamente tutte le parti) Grazie! – pencilCake

+0

Ho chiesto come sostituire questa chiamata jquery ajax con un solo uso di funzioni incorporate JavaScript :) (Vedere la mia ultima domanda, se interessata :)) – pencilCake

+0

L'esempio su http://msdn.microsoft.com/en-us/library /vstudio/bb472488(v=vs.100).aspx mostra un modo per farlo, usando l'oggetto 'XMLHttpRequest'. – carlosfigueira

1

1-Aggiungere l'attributo 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-Usa NewtonSoft serializzare/deserializzare il tuo JSON nel vostro oggetto (si noti quanto sopra appena prende in String), NewtonSoft è molto più veloce rispetto alla MS serializzatore .

uso NewtonSoft per la serializzazione http://json.codeplex.com/

3- il file .svc conterrà fabbrica = "System.ServiceModel.Activation.WebServiceHostFactory

4- web.config conterrà

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

... e ...

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

Se si desidera passare un input JSON a un servizio WCF, non si dovrebbe usare '[WebGet]' - l'input dovrebbe essere passato nel corpo della richiesta, quindi GET non dovrebbe essere usato per questo. Dovrebbe invece usare '[WebInvoke]'. – carlosfigueira