2012-02-24 33 views
16

Tôi đang tạo RestSharp.RestRequest qua:RestSharp có ghi đè lên Loại nội dung được đặt theo cách thủ công không?

RestRequest request = new RestRequest(); 
request.Method = Method.POST; 
request.Resource = "/rest-uri"; 

request.AddHeader("Content-Type", "application/someContentType"); 

string xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" + Environment.NewLine + 
      "<register-request">" + Environment.NewLine + 
      " <name=\"someName\"/>" + Environment.NewLine + 
      "</register-request>"); 

request.AddParameter("text/xml", registerSinkRequest, ParameterType.RequestBody); 

(Các Content-Type là tự thiết để application/someContentType)

Trong debug mode nó cũng cho thấy Content-Type=application/someContentType

Nhưng thực hiện các RestRequest trả về một 415 Media Not Supported -Lỗi và WireShark cho thấy rằng Loại phương tiện được đặt thành text/xml (như được đặt trong phương pháp AddParameter).

Tại sao RestSharp hiển thị Loại nội dung khác thì WireShark? Và làm thế nào tôi có thể ngăn chặn Content-Type được thay đổi (nếu nó là)?

+5

Vậy tại sao bạn không sử dụng 'application/someContentType' trong' AddParameter() '? – svick

Trả lời

20

nhận xét của svick là đúng. Đặt loại nội dung trong thông số đầu tiên là AddParameter() và bạn có thể thoát khỏi cuộc gọi AddHeader().

Trong khi đó là câu trả lời 'đúng', tôi sẽ giải thích lý do tại sao nó có một phương pháp khó hiểu để làm điều này không chính xác rõ ràng.

Cách dự định để thực hiện việc này là sử dụng AddBody() cùng với RestRequest.RequestFormat. Một ví dụ:

var client = new RestClient(); 
// client.XmlSerializer = new XmlSerializer(); // default 
// client.XmlSerializer = new SuperXmlSerializer(); // can override with any implementaiton of ISerializer 

var request = new RestRequest(); 
request.RequestFormat = DataFormat.Xml; 
request.AddBody(objectToSerialize); 

Các serialization của objectToSerialize được dựa trên đăng ký XmlSerializer. Nếu bạn sử dụng RequestFormat = DataFormat.Json thì sử dụng RestClient.JsonSerializer. Việc triển khai ISerializer (mà bạn có thể sử dụng để ghi đè tuần tự hóa mặc định) khai báo các Loại Nội dung của riêng chúng, đó là những gì được chuyển qua quá tải janky AddParameter() mà bạn đang sử dụng.

AddParameter(contentType, content, ParameterType.RequestBody) không bao giờ được gọi trực tiếp. Nó đã được thêm vào như là một workaround để vượt qua mặc dù dữ liệu từ AddBody() nhưng sau đó những thứ khác đã trở thành phụ thuộc vào nó để nó bị mắc kẹt xung quanh. Đó là một quyết định khủng khiếp trong việc nhận thức nhưng đã quá muộn để thay đổi nó trong dòng phiên bản 1xx. Nếu tôi từng xây dựng một phiên bản khác, tôi sẽ làm điều này rõ ràng hơn.

+2

Nếu nó không thực sự được sử dụng, bạn có thể đánh dấu nó là lỗi thời, vì vậy các chương trình hiện tại có thể tiếp tục hoạt động, nhưng nó không hiển thị trong Intellisense nữa, điều này sẽ ngăn chặn hầu hết người dùng gọi nó bằng mã của riêng họ? – Stephanvs

+0

Tôi không nghĩ rằng nó khá lỗi thời. Thêm thuộc tính '[System.ComponentModel.EditorBrowsable (System.ComponentModel.EditorBrowsableState.Never)]' có thể là một phương tiện hạnh phúc (?). –

+0

Tôi không muốn thay đổi bất cứ điều gì về nó bởi vì đó là một giải pháp được công bố rộng rãi cho một vấn đề khác. –

1

Có thể thay đổi Loại nội dung khi bạn đặt nội dung. Tham số NAME cho Nội dung đặt Loại nội dung.

oRequest.Parameters.Add(new Parameter() { Name = "application/json;charset=UTF-8", Type = ParameterType.RequestBody, Value = sBody }); 
Các vấn đề liên quan