2009-10-20 42 views
7

Tôi hiện đang phát triển API cho ứng dụng của mình trên RoRrequest.format return */*

Ví dụ, tôi đã tạo một số XML, được tải với tất cả thông tin tôi cần để tạo đối tượng, giả sử người, và sử dụng Curl tôi gửi nó tới ứng dụng của tôi

tôi có thể gọi chính xác tạo ra hành động tôi muốn từ bộ điều khiển và các params băm của đối tượng đang được thông qua một cách chính xác

Nhưng bây giờ tôi cần phải áp dụng một hành vi khác nếu yêu cầu được thực hiện hay không với XML, điều làm phiền tôi là tại sao trong bộ điều khiển request.format cho */*.

Bất kỳ manh mối nào?

curl -v -H "Content-Type: application/xml; charset=utf-8" --data-ascii @client.xml http://foo.com:3000/clients?api_key=xxx 

def create 
    logger.debug request.format # produces "*/*" 
    if request.format.xml? 
    # never gets here 
    end 
end 

Trả lời

14

*/* có nghĩa là tác nhân người dùng chấp nhận tất cả các định dạng và không quan tâm bạn định dạng định dạng nào. Tôi tin rằng Safari thực hiện điều này, trong số những người khác. Theo mặc định, curl gửi tiêu đề Chấp nhận là */*.

Đây là một bãi chứa các tiêu đề curl gửi theo mặc định:

User-Agent: curl/7.18.1 (i386-apple-darwin9.6.0) libcurl/7.18.1 zlib/1.2.3 
Host: example.com 
Accept: */* 
Content-Type: 

Tuy nhiên, trong trường hợp này, có vẻ như bạn muốn gửi lại XML nếu tải trọng gửi đến bạn là XML? Nếu đúng như vậy, bạn muốn kiểm tra trực tiếp tiêu đề Loại nội dung của yêu cầu. tức là, request.content_type là phương pháp bạn muốn.

Addenda: tôi nghĩ nhiều hơn một chút về vấn đề này, và tôi nghĩ rằng cách tiếp cận tốt nhất là kiểm tra đầu tiên request.format và chỉ khi đó là không phân thắng bại séc request.content_type. Về cơ bản, đặc tả HTTP cung cấp cho các khách hàng có thể nói với các máy chủ rằng "Tôi đang cung cấp cho bạn XML, nhưng tôi muốn JSON trở lại." Tiêu đề Accept là cách khách hàng cho bạn biết họ muốn gì và nếu ai đó gửi nó, bạn nên tôn trọng điều đó. Chỉ sử dụng Loại nội dung của yêu cầu làm gợi ý nếu ứng dụng khách không chỉ định.

+0

trình duyệt? Hmm, bây giờ bạn đã làm tôi bối rối. Tôi đang gửi yêu cầu qua một dòng lệnh, loại trình duyệt không phải là vấn đề –

+0

Vâng, xin lỗi ... Tôi sẽ làm rõ. –

+0

Bây giờ nó có ý nghĩa hơn =) cảm ơn bạn –

0

*/* đơn giản có nghĩa là tất cả các loại MIME đều được chấp nhận.

Nhìn vào mã cho phương thức request.format, loại MIME được xác định bởi phần mở rộng tệp hoặc nếu không có giá trị đó bằng giá trị của tiêu đề HTTP Accept. Vì vậy, bạn cần phải chuyển Curl một tệp XML được lưu vào đĩa hoặc lấy Curl để đặt tiêu đề Chấp nhận thành loại XML MIME (ví dụ: text/xml) khi nó đưa ra yêu cầu cho API của bạn.

+0

Tại sao bỏ phiếu xuống? –

+0

Điều này không chính xác. Anh ta ** đang ** chuyển một tập tin XML. Tải trọng của yêu cầu không có bất kỳ ảnh hưởng nào trên request.format. Bạn phải phát hiện điều đó theo cách thủ công. Phương thức request.format sử dụng thành phần đường dẫn của URI được yêu cầu để lấy định dạng. Vì vậy, nếu URI của bạn kết thúc bằng .xml, anh ta sẽ nhận được giá trị mong đợi. Tuy nhiên, nếu mục tiêu là cung cấp một điểm cuối API duy nhất xử lý nhiều Loại nội dung, điều đó sẽ không giúp ích gì. –

+0

Hiện tại, tôi đang sử dụng kiểu nội dung là application/xml, được đổi thành text/xml và vẫn tạo cùng request.format (*/*) Tệp được chuyển đến curl được lưu trên đĩa –