web-dev-qa-db-ja.com

JSONパラメーターをRESTfulWCFサービスとの間で受け渡しする方法は?

私は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メソッドの戻り値を呼び出してクライアントに返しますか?
8
pencilCake

そのJSON入力を受信するWCF操作を作成する場合は、その入力にマップするデータコントラクトを定義する必要があります。それを自動的に行うツールがいくつかあります。その中には、しばらく前に書いたものも含まれます 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を介して)サービスを呼び出す1つの例を以下に示します。

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));
    }
});
13
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をオブジェクトにシリアル化/逆シリアル化します(上記はStringを使用するだけであることに注意してください)。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>
1
lcryder