2012-12-17 4 views
7

Ich bin ein Anfänger bei RESTful Services.Wie man einen JSON-Parameter an/mit RESTful WCF-Dienst übergibt und konsumiert?

Ich muss eine Schnittstelle erstellen, wo der Client bis zu 9 Parameter übergeben muss.

Ich würde lieber die Parameter als JSON-Objekt übergeben.

Zum Beispiel, wenn meine JSON ist:

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

Und wenn ich brauche eine serverseitige Methode, die unten am Ende auszuführen:

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

Frage (n):
Wie Soll ich den Aufruf von der Client-Seite mit der obigen JSON-Zeichenfolge ausführen? Und wie kann ich eine Signatur und Umsetzung der RESTful-Service-Methode erstellen, die

  • dieses JSON akzeptiert,
  • Parsen und deserialisiert es in Person Objekt und
  • Anrufe/kehrt die Rückgabewert der FindPerson Methode zurück zu Klient?
+0

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

+0

Welche Sprache verwenden Sie den Service anrufen? JavaScript, C#, etwas anderes? – carlosfigueira

Antwort

9

Wenn Sie Möchten Sie eine WCF-Operation erstellen, um diese JSON-Eingabe zu erhalten, müssen Sie einen Datenvertrag definieren, der dieser Eingabe zugeordnet ist. Es gibt ein paar Werkzeuge, die das automatisch tun, einschließlich eines, das ich eine Weile zurück geschrieben habe, unter http://jsontodatacontract.azurewebsites.net/ (mehr Details darüber, wie dieses Werkzeug bei this blog post geschrieben wurde). Das Tool generiert diese Klasse, die Sie verwenden können:

Als nächstes müssen Sie einen Betriebsvertrag definieren, um das zu erhalten. Da der JSON in den Hauptteil der Anfrage gehen muss, ist die natürlichste zu verwendende HTTP - Methode POST, so dass Sie die Operation wie folgt definieren können: Die Methode ist "POST" und der Stil ist "Bare" (was bedeutet, dass Ihre JSON wird direkt dem Parameter zugeordnet. Beachten Sie, dass Sie die Eigenschaften Method und BodyStyle sogar weglassen können, da "POST" bzw. WebMessageBodyStyle.Bare ihre Standardwerte sind).

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

nun bei dem Verfahren haben Sie die Eingabe in lookupPerson abgebildet. Wie Sie die Logik Ihrer Methode implementieren, bleibt Ihnen überlassen.

Update nach Kommentar

Ein Beispiel für den Dienst Aufruf mit Hilfe von JavaScript (via jQuery) können Sie unten.

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

Sehr nützliche Antwort carlosfigueira! (Können Sie auch den Javascript-Aufruf hinzufügen, so dass es alle Teile grob abdecken kann) Danke! – pencilCake

+0

Ich habe gefragt, wie man diesen jQuery Ajax Anruf durch eine JavaScript eingebaute Funktionen Funktionen nur ersetzen :) (Siehe meine letzte Frage, wenn Sie interessiert :)) – pencilCake

+0

Das Beispiel unter http://msdn.microsoft.com/en-us/library /vstudio/bb472488(v=vs.100).aspx zeigt eine Möglichkeit, dies zu tun, indem das Objekt 'XMLHttpRequest' verwendet wird. – carlosfigueira

1

1-Fügen Sie das WebGet Attribut

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

2-Nutzung NewtonSoft serialisiert/deserialisiert Ihre json in Ihrem Objekt (beachten Sie die oben nimmt nur in String), NewtonSoft ist viel schneller als die MS Serializer .

Verwendung NewtonSoft für die Serialisierung http://json.codeplex.com/

3- Ihre SVC-Datei enthält Fabrik = "System.ServiceModel.Activation.WebServiceHostFactory

4- web.config

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

enthalten ... und ...

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

Wenn Sie eine JSON-Eingabe an einen WCF-Dienst übergeben möchten, sollten Sie '[WebGet]' nicht verwenden - die Eingabe sollte im Anfragetext übergeben werden, daher sollte GET nicht dafür verwendet werden. Es sollte "[WebInvoke]" stattdessen verwenden. – carlosfigueira

Verwandte Themen