2012-12-17 8 views
7

私はRESTfulなサービスの初心者です。JSONパラメータをRESTful WCFサービスとの間で受け渡しする/消費する方法

クライアントが最大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文字列でクライアント側から呼び出しを行う必要がありますか? そして、どのように私は

  • このJSONを受け入れRESTfulなサービスメソッドのシグネチャと実装を作成することができ、
  • パースとPersonオブジェクトにそれをデシリアライズし、
  • 通話/背面にFindPersonメソッドの戻り値を返します。クライアント?
+0

は、サービスを呼び出すために使用している言語http://stackoverflow.com/questions/13165533/deserialize-json-object-sent-from-android-app-to-wcf-webservice –

+0

を参照してください? JavaScript、C#、他の何か? – carlosfigueira

答えて

9

そのJSON入力を受け取るWCF操作を作成したい場合は、その入力にマップするデータコントラクトを定義する必要があります。 http://jsontodatacontract.azurewebsites.net/に書き込んだものを含めて、自動的に行うツールがいくつかあります(詳細はthis blog postで書かれています)。このクラスを生成したツールでは、次のクラスを使用できます。

// 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はパラメータに直接マッピングされます)。 "POST"WebMessageBodyStyle.Bareがそれぞれデフォルト値であるため、MethodBodyStyleのプロパティを省略することもできます。

[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にマップされています。メソッドのロジックをどのように実装するかは、あなた次第です。 (jQueryの経由)JavaScriptを使用してサービスを呼び出すのコメントの後

一例

アップデートは以下の見つけることができます。

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

非常に有用な答えcarlosfigueira! (Javascriptコールを追加して、すべての部分をほぼカバーできるようにすることもできます)ありがとうございます! – pencilCake

+0

私はこのjquery ajax呼び出しを、JavaScript組み込み関数の使用法と置き換える方法を尋ねました:)(私の最後の質問が興味のある場合は、:) :) – pencilCake

+0

http://msdn.microsoft.com/en-us/library /vstudio/bb472488(v=vs.100).aspxは、XMLHttpRequest'オブジェクトを使用してこれを行う方法を示しています。 – carlosfigueira

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があなたのオブジェクトにデシリアライズ/シリアライズする1-追加(上記の点に注意してくださいだけで文字列になります)、NewtonSoftはMSシリアライザよりもはるかに高速であります。直列化のための

使用NewtonSoftはhttp://json.codeplex.com/

3 - あなたの.SVCファイルは工場= "System.ServiceModel.Activation.WebServiceHostFactory

4 - あなたのweb.configファイルが含まれています含まれています

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

...と...

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

JSON入力をWCFサービスに渡す場合、 '[WebGet]'は使用しないでください。入力はリクエスト本体に渡す必要がありますので、GETは使用しないでください。代わりに '[WebInvoke]'を使うべきです。 – carlosfigueira

関連する問題