2014-07-26 16 views
17

Tôi đang sử dụng Corona SDK để gửi dữ liệu với C# máy chủ của tôi:Nancy (C#): Làm cách nào để nhận dữ liệu bài đăng của tôi?

headers["Content-Type"] = "application/x-www-form-urlencoded" 
headers["Accept-Language"] = "en-US" 

local body = "color=red&size=small" 

local params = {} 
params.headers = headers 
params.body = body 

network.request(host .. "/UpdateHand", "POST", nwListener, params) 

tôi nhận được một tin nhắn trên máy chủ:

Post["/UpdateHand"] = x => 
     { 
      Console.WriteLine("Received ..."); 
      return "Ok"; 
     }; 

Nhưng khi tôi kiểm tra dữ liệu (khi tôi đặt một breakpoint trên nó) Tôi không nhìn thấy nơi dữ liệu của tôi là locaded (tức là params.body hoặc params.headers). Làm thế nào tôi có thể trích xuất thông tin này?

tôi nên đăng nó một cách chính xác theo các tài liệu trên Corona: http://docs.coronalabs.com/daily/api/library/network/request.html

+0

Nếu bạn không muốn sử dụng ràng buộc mô hình, kiểm tra câu trả lời này http://stackoverflow.com/a/30571313/790465 –

Trả lời

22

Dữ liệu bài là trong

this.Request.Body 

Nếu bạn có loại phù hợp bạn có thể deserialize dữ liệu của bạn để nó sử dụng mô hình ràng buộc:

var x = this.Bind<YourType>(); 
+0

Cảm ơn, tôi không có một loại phù hợp với thời điểm vì vậy tôi đã làm người đầu tiên. Đầu ra của tôi là, khi tôi làm var b = this.Request.Body, là "Nancy.IO.RequestStream". Không nên nhận được cơ thể khi nó đang được gửi đi? – Jefecito

+0

Ok, do đó, điều này dường như cung cấp cho một số đầu ra mong muốn: var id = this.Request.Body; byte [] dữ liệu = byte mới [10]; id.Read (dữ liệu, 0, 5); Console.WriteLine (System.Text.Encoding.Default.GetString (dữ liệu)); – Jefecito

+14

Nếu bộ nhớ phục vụ có một phương pháp mở rộng AsString cho RequestStream, vì vậy bạn có thể lấy phần thân làm chuỗi bằng cách thực hiện điều này.Request.Body.AsString() –

6

Điều này thực sự hiệu quả:

var body = this.Request.Body; 
int length = (int) body.Length; // this is a dynamic variable 
byte[] data = new byte[length]; 
body.Read(data, 0, length);    
Console.WriteLine(System.Text.Encoding.Default.GetString(data)); 
0

Lý tưởng nhất để nhận dữ liệu bài đăng của bạn có thể được thực hiện bằng một cuộc gọi Bind() đơn giản. Tuy nhiên, tôi đã nhìn thấy kết quả không phù hợp khi sử dụng một Bind trong một cuộc gọi bài như vậy mà tôi đã sử dụng để sử dụng các đề án nêu trên.

Tôi đã thấy nhiều cuộc thảo luận khác nhau về Nancy Bind() làm việc và không hoạt động ... Tôi đã thấy cả hai bài đăng nhưng không thể giải thích sự không thống nhất. Nơi tôi nhìn thấy nó hoạt động đúng là nơi tôi có thể đảm bảo cơ thể của yêu cầu được quản lý như sau:

 var data = Encoding.ASCII.GetBytes (postData); 

     request.Method = "POST"; 
     request.ContentType = "application/json"; 
     request.ContentLength = data.Length; 

     using (var stream = request.GetRequestStream()) { 
      stream.Write (data, 0, data.Length); 
     } 

Tuy nhiên, khi gửi dữ liệu mà lẽ ra phải được xử lý tương tự (mặc dù tôi không thể xác nhận) thông qua cơ sở hạ tầng WSO2 (dữ liệu được tuần tự hóa dưới dạng từ điển sự kiện JSON được gửi tới một proxy dịch vụ), Bind thất bại trong khi phương thức trên đã thành công.

7

Có tiện ích mở rộng của Nancy cho việc này. Bạn sẽ cần phải bao gồm không gian tên cho nó.

using Nancy.Extensions; 
var text = Context.Request.Body.AsString(); 

Tôi thích cách súc tích này là một phần của con đường siêu dễ dãi của Nancy.

Nhưng một lời cảnh cáo! Phương thức này rời khỏi luồng ở cuối, vì vậy các cuộc gọi tiếp theo sẽ trả về chuỗi rỗng. Để khắc phục điều này, hãy luôn đặt lại luồng ngay sau đó, như sau:

Request.Body.Seek(0, SeekOrigin.Begin); 

Nancy 2.0 được coi là chính xác để vị trí dòng được đặt lại theo mặc định.

https://github.com/NancyFx/Nancy/pull/2158

+0

Sử dụng Nancy 2.0.0 - nhưng 'Context.Request.Body' là' System.IO.Stream' - vì vậy không có 'AsString': ( –

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