2012-12-17 29 views
7

Tôi là người mới bắt đầu tại các dịch vụ RESTful.Làm thế nào để vượt qua và tiêu thụ một tham số JSON đến/với dịch vụ WCF RESTful?

Tôi cần tạo giao diện trong đó máy khách cần chuyển tối đa 9 thông số.

Tôi muốn chuyển các tham số dưới dạng đối tượng JSON.

Ví dụ nếu JSON của tôi là:

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

Và nếu tôi cần phải thực hiện một phương pháp máy chủ bên dưới cuối cùng:

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

Câu hỏi (s):
thế nào tôi có nên thực hiện cuộc gọi từ phía máy khách với chuỗi JSON ở trên không? Và làm thế nào tôi có thể tạo ra một chữ ký và thực hiện các phương pháp dịch vụ RESTful rằng

  • chấp nhận JSON này,
  • phân tích và deserializes nó vào đối tượng Person và
  • cuộc gọi/trả về giá trị trả về phương pháp của FindPerson trở lại khách hàng?
+0

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

+0

Ngôn ngữ mà bạn đang sử dụng để gọi dịch vụ? JavaScript, C#, cái gì khác? – carlosfigueira

Trả lời

9

Nếu bạn muốn tạo một hoạt động WCF để nhận được đầu vào JSON đó, bạn sẽ cần phải xác định một hợp đồng dữ liệu ánh xạ tới đầu vào đó. Có một vài công cụ tự động làm điều đó, bao gồm một công cụ mà tôi đã viết một lúc trở lại tại http://jsontodatacontract.azurewebsites.net/ (chi tiết hơn về cách công cụ này được viết tại this blog post). Công cụ tạo lớp này, bạn có thể sử dụng:

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

Tiếp theo, bạn cần xác định hợp đồng hoạt động để nhận điều đó. Vì JSON cần phải đi vào phần thân của yêu cầu, phương thức HTTP tự nhiên nhất để sử dụng là POST, vì vậy bạn có thể xác định hoạt động như sau: phương thức là "POST" và kiểu "Bare" (có nghĩa là JSON ánh xạ trực tiếp đến tham số). Lưu ý rằng bạn thậm chí có thể bỏ qua các thuộc tính MethodBodyStyle, vì "POST"WebMessageBodyStyle.Bare là các giá trị mặc định của chúng tương ứng).

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

Bây giờ, tại phương pháp bạn đã nhập ánh xạ tới lookupPerson. Làm thế nào bạn sẽ thực hiện logic của phương pháp của bạn là tùy thuộc vào bạn.

Cập nhật sau khi bình luận

Một ví dụ về cách gọi dịch vụ sử dụng JavaScript (thông qua jQuery) có thể được tìm thấy dưới đây.

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

Câu trả lời rất hữu ích carlosfigueira! (Bạn cũng có thể thêm các cuộc gọi Javascript để nó có thể bao gồm tất cả các phần gần) Cảm ơn! – pencilCake

+0

Tôi đã hỏi cách thay thế cuộc gọi jquery ajax này bằng cách sử dụng hàm JavaScript được xây dựng chỉ :) (Xem câu hỏi cuối cùng của tôi, nếu quan tâm :)) – pencilCake

+0

Mẫu tại http://msdn.microsoft.com/en-us/library /vstudio/bb472488(v=vs.100).aspx hiển thị một cách để làm điều đó, bằng cách sử dụng đối tượng 'XMLHttpRequest'. – carlosfigueira

1

1-Thêm thuộc tính 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-Sử dụng NewtonSoft serialize/deserialize json của bạn vào đối tượng của bạn (chú ý trên chỉ mất trong String), NewtonSoft là nhanh hơn nhiều so với MS serializer .

sử dụng NewtonSoft cho serialization http://json.codeplex.com/

3- tập tin .svc của bạn sẽ chứa Factory = "System.ServiceModel.Activation.WebServiceHostFactory

4 web.config của bạn sẽ chứa

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

... và ...

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

Nếu bạn muốn chuyển một đầu vào JSON vào một dịch vụ WCF, bạn không nên sử dụng '[WebGet]' - đầu vào phải được truyền vào phần thân yêu cầu, vì vậy không nên sử dụng GET cho điều đó. Nó nên sử dụng '[WebInvoke]' thay thế. – carlosfigueira

Các vấn đề liên quan