2013-08-21 32 views
7

Tôi đang sử dụng RestSharp và sử dụng Json.NET để tuần tự hóa (xem here).Tôi làm cách nào để RestSharp sử dụng BSON?

Json.NET hỗ trợ BSON và vì một số yêu cầu của tôi có khối dữ liệu nhị phân khổng lồ, tôi nghĩ điều này sẽ làm tăng đáng kể ứng dụng của tôi. Tuy nhiên, theo như tôi có thể nói, RestSharp dường như không có bất kỳ hỗ trợ trong xây dựng cho BSON.

Việc sử dụng Json.NET được thực hiện như là một serializer tùy chỉnh cho RestSharp, và vì vậy trong nháy mắt đầu tiên có vẻ như nó sẽ có thể sửa đổi serializer tùy chỉnh để sử dụng BSON. Tuy nhiên, phương thức Serialize của giao diện RestSharp.Serializers.ISerializer trả lại một string - tức là (tôi giả định) không phù hợp với BSON. Vì vậy, tôi giả định rằng sẽ có một số thay đổi quan trọng hơn đối với RestSharp để thực hiện thay đổi này.

Có ai đã tìm ra cách để thực hiện việc này không?


Cập nhật: Tôi nhìn vào nguồn RestSharp, và phát hiện ra rằng RestRequest.AddBody phương pháp mà có đối tượng của tôi và serializes nó vào cơ thể yêu cầu cuối cùng gọi Request.AddParameter (với các dữ liệu đối tượng tuần tự hóa và kiểu tham số RequestBody).

Tôi nhận thấy rằng tôi có thể sắp xếp thứ tự đối tượng của mình vào BSON và sau đó gọi trực tiếp Request.AddParameter - và thực sự tôi có thể. Tuy nhiên, khi RestSharp sau đó thực hiện các RestRequest, nó không đưa nội dung nhị phân vào yêu cầu, bởi vì có những giả định nhúng khác về nội dung yêu cầu được mã hóa UTF-8.

Như vậy có vẻ như hack này sẽ không hoạt động - có sẽ cần phải có một số thay đổi được thực để RestSharp chính nó, và tôi không phải là người đàn ông cho công việc ...


Cập nhật 2: Tôi đã quyết định sử dụng trình gỡ rối để tìm ra bao nhiêu RestSharp mà tôi phải thay đổi để khắc phục vấn đề mã hóa cơ thể, vì vậy tôi đã hoán đổi phiên bản RestSharp NuGet và đưa dự án RestSharp vào trong giải pháp của mình. Và ... nó đã hoạt động.

Nó chỉ ra rằng đã có một sự thay đổi để RestSharp trong vài tháng qua mà chưa có trong phiên bản NuGet.

Vì vậy, bạn có thể hiện sử dụng AddParameter và chuyển vào đối tượng đã mã hóa BSON và RestSharp sẽ gửi nó đến máy chủ mà không có khiếu nại.

Trả lời

6

mỗi bản cập nhật trong câu hỏi của tôi, nó chỉ ra rằng nếu bạn có nguồn RestSharp mới nhất, sau đó thay vì điều này:

 request.AddBody(myObject); 

... bạn có thể làm điều này thay vì bất cứ khi nào bạn có một tải trọng mà có thể được hưởng lợi từ việc sử dụng BSON:

 using (var memoryStream = new System.IO.MemoryStream()) 
     { 
      using (var bsonWriter = new Newtonsoft.Json.Bson.BsonWriter(memoryStream)) 
      { 
       var serializer = new Newtonsoft.Json.JsonSerializer(); 

       serializer.Serialize(bsonWriter, myObject); 

       var bytes = memoryStream.ToArray(); 

       request.AddParameter("application/bson", bytes, RestSharp.ParameterType.RequestBody); 
      } 
     } 

Lưu ý rằng các tham số đầu tiên AddParameter được cho là tên tham số, nhưng trong trường hợp của ParameterType.RequestBody nó thực sự được sử dụng như các loại nội dung. (Yuk)

Lưu ý rằng điều này dựa trên một change thực hiện để RestSharp trên 11 tháng 4 năm 2013 bởi ewanmellor/ayoung, và sự thay đổi này là không trong phiên bản hiện hành về NuGet (104,1).Do đó điều này sẽ chỉ hoạt động nếu bạn bao gồm nguồn RestSharp hiện tại trong dự án của bạn.

3

Câu trả lời của Gary cho câu hỏi của riêng mình vô cùng hữu ích cho việc sắp xếp các cuộc gọi yên tĩnh. Tôi muốn trả lời cách để deserialize cuộc gọi yên tĩnh bằng cách sử dụng JSON.NET. Tôi đang sử dụng phiên bản RestSharp 104.4 cho Silverlight. Máy chủ của tôi đang sử dụng API Web 2.1 with BSON support turned on.

Để chấp nhận một phản ứng BSON, tạo một BSON deserializer cho RestSharp như vậy

public class BsonDeserializer : IDeserializer 
{ 
    public string RootElement { get; set; } 
    public string Namespace { get; set; } 
    public string DateFormat { get; set; } 

    public T Deserialize<T>(IRestResponse response) 
    { 
     using (var memoryStream = new MemoryStream(response.RawBytes)) 
     { 
      using (var bsonReader = new BsonReader(memoryStream)) 
      { 
       var serializer = new JsonSerializer(); 
       return serializer.Deserialize<T>(bsonReader); 
      } 
     } 
    } 
} 

Sau đó, đảm bảo yêu cầu của bạn chấp nhận "application/bson"

var request = new RestRequest(apiUrl, verb); 
request.AddHeader("Accept", "application/bson"); 

Và thêm một handler cho phương tiện truyền thông rằng loại

var client = new RestClient(url); 
client.AddHandler("application/bson", new BsonDeserializer()); 
+0

Câu trả lời này đã giúp tôi rất nhiều, trong trường hợp bất kỳ ai nhận được ngoại lệ "Chuỗi chứa nhiều hơn tha n một phần tử "khi thêm trình xử lý, tôi đã sửa nó bằng cách thêm Trình xử lý trước khi thêm các Header mặc định vào cá thể RestClient – yvesmancera

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