As Aristotle replied, Location header is unspecified for 202
(Accepted). Instead, provide a body such as the following:
<status>
<link href="http://example.org/stats?someid"/>
...
</status>
so that the client can check the status of the response. If the
process succeeded in creating a resource, only then provide a link to
the newly created resource, which you can do as part of the status
check response. That is, don't advertise /backups/version_x until the
resource has been created. Here is a possible flow:
POST /something ===> 202 Accepted + link to a status check URL with in
the response
GET /status_check_url => 200 OK + status response, when not completed
GET /status_check_url => 200 OK + status response, when completed, but
was not successful
GET /status_check_url => 300 See Other + Location: uri_to_resource,
when competed successfully
Subbu
On Sep 6, 2008, at 1:21 PM, bierstuebl wrote:
> Hi all,
>
> I'm new to this mailing list and to be honest: I've neve been on a
> mailing list before. So in case I'm doing things wrong, please be
> forgiving.
>
> However, here is my first question:
>
> I would like to use asynchronous REST by POSTing a request to e.g.
> /backups (for creating a new backup version), which will return me a
> 202 with a location in the header. What should this location look
> like?
> I think it should look like /backups/version_x and NOT be somewhere
> else like /queue/backups/version_x or the like.
> However, if a client starts polling now on /backups/version_x and the
> process hasn't finished yet, what should be returned? A 404 with a
> body until the process is finished an the real representation can be
> sent with 200?
>
> Using a new resource like /queue/backups/version I could return a 200
> with some status information in it. However, the client initially
> requested a representation of a backup, but when it starts polling on
> the new resource it receives another representation, the a status
> representeation. How could a client adjust to this situation without
> knowing in advance that the action would be asynchronous??
>
> Hmm, it's difficult to describe the problem. I hope it's
> understandable somehow.
>
> regards,
> Roland
>
>
> <!-- #ygrp-mkp{ border: 1px solid #d8d8d8; font-family: Arial;
> margin: 14px 0px; padding: 0px 14px; } #ygrp-mkp hr{ border: 1px
> solid #d8d8d8; } #ygrp-mkp #hd{ color: #628c2a; font-size: 85%; font-
> weight: bold; line-height: 122%; margin: 10px 0px; } #ygrp-mkp
> #ads{ margin-bottom: 10px; } #ygrp-mkp .ad{ padding: 0 0; } #ygrp-
> mkp .ad a{ color: #0000ff; text-decoration: none; } --> <!-- #ygrp-
> sponsor #ygrp-lc{ font-family: Arial; } #ygrp-sponsor #ygrp-lc
> #hd{ margin: 10px 0px; font-weight: bold; font-size: 78%; line-
> height: 122%; } #ygrp-sponsor #ygrp-lc .ad{ margin-bottom: 10px;
> padding: 0 0; } --> <!-- #ygrp-mlmsg {font-size:13px; font-family:
> arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small;}
> #ygrp-mlmsg table {font-size:inherit;font:100%;} #ygrp-mlmsg select,
> input, textarea {font:99% arial,helvetica,clean,sans-serif;} #ygrp-
> mlmsg pre, code {font:115% monospace;*font-size:100%;} #ygrp-mlmsg *
> {line-height:1.22em;} #ygrp-text{ font-family: Georgia; } #ygrp-
> text p{ margin: 0 0 1em 0; } #ygrp-tpmsgs{ font-family: Arial;
> clear: both; } #ygrp-vitnav{ padding-top: 10px; font-family:
> Verdana; font-size: 77%; margin: 0; } #ygrp-vitnav a{ padding: 0
> 1px; } #ygrp-actbar{ clear: both; margin: 25px 0; white-
> space:nowrap; color: #666; text-align: right; } #ygrp-
> actbar .left{ float: left; white-space:nowrap; } .bld{font-
> weight:bold;} #ygrp-grft{ font-family: Verdana; font-size: 77%;
> padding: 15px 0; } #ygrp-ft{ font-family: verdana; font-size: 77%;
> border-top: 1px solid #666; padding: 5px 0; } #ygrp-mlmsg
> #logo{ padding-bottom: 10px; } #ygrp-reco { margin-bottom: 20px;
> padding: 0px; } #ygrp-reco #reco-head { font-weight: bold; color:
> #ff7900; } #reco-grpname{ font-weight: bold; margin-top: 10px; }
> #reco-category{ font-size: 77%; } #reco-desc{ font-size: 77%; }
> #ygrp-vital{ background-color: #e0ecee; margin-bottom: 20px;
> padding: 2px 0 8px 8px; } #ygrp-vital #vithd{ font-size: 77%; font-
> family: Verdana; font-weight: bold; color: #333; text-transform:
> uppercase; } #ygrp-vital ul{ padding: 0; margin: 2px 0; } #ygrp-
> vital ul li{ list-style-type: none; clear: both; border: 1px solid
> #e0ecee; } #ygrp-vital ul li .ct{ font-weight: bold; color: #ff7900;
> float: right; width: 2em; text-align:right; padding-right: .5em; }
> #ygrp-vital ul li .cat{ font-weight: bold; } #ygrp-vital a{ text-
> decoration: none; } #ygrp-vital a:hover{ text-decoration:
> underline; } #ygrp-sponsor #hd{ color: #999; font-size: 77%; } #ygrp-
> sponsor #ov{ padding: 6px 13px; background-color: #e0ecee; margin-
> bottom: 20px; } #ygrp-sponsor #ov ul{ padding: 0 0 0 8px; margin:
> 0; } #ygrp-sponsor #ov li{ list-style-type: square; padding: 6px
> 0; font-size: 77%; } #ygrp-sponsor #ov li a{ text-decoration: none;
> font-size: 130%; } #ygrp-sponsor #nc{ background-color: #eee; margin-
> bottom: 20px; padding: 0 8px; } #ygrp-sponsor .ad{ padding: 8px 0; }
> #ygrp-sponsor .ad #hd1{ font-family: Arial; font-weight: bold;
> color: #628c2a; font-size: 100%; line-height: 122%; } #ygrp-
> sponsor .ad a{ text-decoration: none; } #ygrp-sponsor .ad
> a:hover{ text-decoration: underline; } #ygrp-sponsor .ad p{ margin:
> 0; } o{font-size: 0; } .MsoNormal{ margin: 0 0 0 0; } #ygrp-text
> tt{ font-size: 120%; } blockquote{margin: 0 0 0 4px;} .replbq{margin:
> 4} -->