5

HTTP/1.1 standard tuyên bố rằng nếu kết quả hoạt động của POST trong việc tạo tài nguyên, thì phản hồi phải bao gồm tiêu đề Location với địa chỉ của tài nguyên mới.Câu trả lời HTTP POST Tiêu đề vị trí khi tạo nhiều tài nguyên

Nếu một nguồn tài nguyên đã được tạo ra trên máy chủ gốc, phản ứng NÊN được 201 (Created) và chứa một thực thể trong đó mô tả tình trạng được yêu cầu và đề cập đến các tài nguyên mới, và một tiêu đề Location (xem phần 14.30).

và trong phần 14.30,

Đối với 201 phản ứng (tạo), Vị trí là của tài nguyên mới được tạo ra bởi yêu cầu.

Giả sử rằng API của tôi cho phép tạo hàng loạt tài nguyên bằng cách POST nhập mảng vào URL tài nguyên bộ sưu tập. Ví dụ:

POST /books 
[ 
    { 
     "name": "The Colour of Magic", 
     "published": "1983" 
    }, 
    { 
     "name": "The Light Fantastic", 
     "published": "1986" 
    } 
] 

Kể từ khi hai \book\{bookId} nguồn này đã được tạo ra, những gì nên được giá trị của Location tiêu đề trong trường hợp này?

Câu hỏi Http post response after multiple new resource creation? tương tự, nhưng nó hỏi về thực thể phản hồi, không phải tiêu đề (và chưa được trả lời).

Trả lời

1

Tôi biết câu trả lời này là muộn để các nhưng tôi tin rằng giải pháp tốt nhất là tạo tài nguyên Hàng loạt mới với mã nhận dạng uuid mà wo uld trả lại danh sách URL của các sách đã được thêm bằng URL như sau:

http://api.example.com/batches/{uuid} 

ví dụ:

http://api.example.com/batches/2b9b251f71a4b2901d66e04725bc0c9cb5843c74 

Sau đó bạn POST hoặc PUT có thể trả lại URL ở trên nó Location: {url} header và một mã 201 - Created trạng thái.

Nếu sau đó bạn GET URL đó sau đó sẽ là danh sách các URL được tạo trong lô đó cũng như bất kỳ thông tin nào khác về lô như uuid và ngày/giờ được tạo.

{ 
    "uuid": "2b9b251f71a4b2901d66e04725bc0c9cb5843c74", 
    "datetime": "2005-08-15T15:52:01+00:00", 
    "books": [ 
    "http://api.example.com/books/the-colour-of-magic", 
    "http://api.example.com/books/the-light-fantastic" 
    ] 
} 

Sau đó, các tài nguyên đó có thể có TTL mỗi giờ hoặc một tháng, bất kể bạn chọn gì. Trong số họ có thể sống mãi mãi nếu bạn muốn; bất kỳ trường hợp sử dụng nào của bạn đều yêu cầu.

4

RFC 2616 đã lỗi thời. Ngừng nhìn nó trừ những mục đích lịch sử.

Các spec hiện nay, RFC 7231, nói:

"Nếu một hoặc nhiều nguồn lực đã được tạo ra trên máy chủ gốc là kết quả của chế biến thành một yêu cầu POST, các máy chủ gốc NÊN gửi 201 (Created) phản hồi chứa trường tiêu đề Vị trí cung cấp mã định danh cho tài nguyên chính được tạo (Mục 7.1.2) và biểu diễn mô tả trạng thái của yêu cầu trong khi tham chiếu đến (các) tài nguyên mới. " - http://greenbytes.de/tech/webdav/rfc7231.html#POST

Và có, điều đó không giúp ích nhiều khi không có tài nguyên "chính".

+0

Như bạn có thể thấy trong ví dụ của tôi, không có tài nguyên "chính" - chúng là tất cả các đồng nghiệp. Không chắc chắn phải làm gì trong trường hợp đó. – metacubed

+0

Và cảm ơn bạn đã liên kết tới RFC mới! Sẽ phải đánh dấu nó để tham khảo. – metacubed

+0

Tôi sẽ để câu hỏi mở một chút để xem có ai có đề xuất nào khác không. – metacubed

2

Tôi nghĩ rằng bạn đang sử dụng một trường hợp cụ thể cho tiêu đề Location. Trong trường hợp tạo hàng loạt, kết quả của quá trình xử lý thường được cung cấp trong chính nội dung trả về. Như một vấn đề của thực tế, việc xử lý có thể hoàn toàn hoặc một phần thành công. Tôi có nghĩa là tất cả các yếu tố đã được thêm vào hoặc chỉ là một tập hợp con và kết quả cho thấy người dùng cuối những gì thực sự xảy ra.

Vì vậy, tôi nghĩ rằng tiêu đề Location không thể sử dụng được trong ngữ cảnh như vậy. Tôi thấy hai tùy chọn cho mã trạng thái:

  • Các mã trạng thái là nếu ít nhất một yếu tố được tạo ra)
  • Các mã trạng thái là để nói rằng yêu cầu số lượng lớn trên toàn cầu thành công nhưng kết quả của mỗi hoạt động được mô tả trong nội dung phản hồi.

Tuy nhiên, bạn có thể nhận thấy rằng mã trạng thái tồn tại nếu tài nguyên của bạn xử lý các tác phẩm hàng loạt theo cách không đồng bộ. Nhưng trong bối cảnh đó, bạn cần sau đó kéo một tài nguyên để có được trạng thái của các chèn.

Về nội dung phản hồi, bạn được tự do lựa chọn. Chúng ta có thể tưởng tượng một cái gì đó như thế:

{ 
"took": 4, 
"errors": true | false, 
"items": [ 
    { "added": true, 
    "error": null 
    "id": "123" 
    }, 
    { "added": false, 
    "error": { 
     "code": "err12", 
     "description": "validation error (field type, ...)" 
    } 
    "id": null 
    } 
    ] 
} 

ElasticSearch cung cấp api số lượng lớn như vậy với tạo mà còn cập nhật và xóa hỗ trợ - xem liên kết này để biết thêm chi tiết: http://www.elastic.co/guide/en/elasticsearch/guide/current/bulk.html.

Dưới đây là những câu hỏi tương tự mà có thể đưa ra một số gợi ý:

Hy vọng nó giúp bạn, Thierry

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