我正在构建一个允许客户端存储对象的服务器.这些对象在客户端完全构造,完整的对象ID对于对象的整个生命周期是永久的.
我已经定义了API,以便客户端可以使用PUT创建或修改对象:
PUT /objects/{id} HTTP/1.1
...
{json representation of the object}
{id}是对象ID,因此它是Request-URI的一部分.
现在,我也在考虑允许客户端使用POST创建对象:
POST /objects/ HTTP/1.1
...
{json representation of the object, including ID}
由于POST意味着"附加"操作,我不知道如果对象已经存在该怎么做.我应该将请求视为修改请求还是应该返回一些错误代码(哪个)?
根据"REST意识形态",PUT/POST/DELETE请求的响应主体应该是什么?
返回代码怎么样?是否HTTP_OK足够?
如果有的话,这些公约的原因是什么?
我发现了一篇描述POST/PUT差异的好帖子:POST vs PUT 但它仍然没有回答我的问题.
我们正在计划一个主要为移动应用提供内容的项目,但需要有一个网站.
我的问题是使用Jersey或Restlet为我们的移动应用程序开发REST API是否有意义,然后使用Play!为网站服务.
或者只是使用Play更有意义!做到这一切?如果是这样,如何使用Play进行REST!框架?
因此,假设Http中的DELETE谓词是幂等的,当我发出以下请求时,第二个(或第三个,或第四个,等等)会发生什么?
DELETE /person/123
第一次,资源被删除,我返回204(成功,没有内容).我应该在后续电话或404(未找到)上返回204吗?
我有一个使用uri的资源/api/books/122,如果客户端为此资源发送HTTP Delete时该资源不存在,那么此操作的相应响应代码是什么?是404找不到?
谢谢
我正在进行一个REST DELETE调用,返回204.在jQuery 1.8.3中,这有效,并命中request.done回调.但是如果我使用1.9,那么它会在textStatus中使用parsererror发送到request.fail,并在errorThrown中使用'SyntaxError:意外的输入结尾'.
remove = function (complete) {
            var self = this;
            var request = $.ajax({
              context: self,
              url: "/v1/item/" + itemId,
              dataType: "json",
              type: "DELETE"
            });
            request.done(removeCallback);
            request.fail(function (xhr, textStatus, errorThrown) {
                alert(errorThrown);
            });
        },
任何人都知道1.9中会发生什么变化导致失败,以及为了解决这个问题需要改变什么?
所以,回答我自己的问题,看起来这实际上是问题所在:
jQuery.ajax返回空字符串的JSON结果
在1.9之前,期望返回数据类型为JSON或JSONP的ajax调用会将空字符串的返回值视为成功案例,但会将null返回给成功处理程序或promise.从1.9开始,为JSON数据返回的空字符串被认为是格式错误的JSON(因为它是); 这将导致错误.使用错误处理程序来捕获此类情况.
所以,如果删除dataType
dataType: "json",
它适用于jQuery 1.8.3和1.9.
我正在研究如何Spring处理REST Web服务(但我不知道它是否是Spring相关的答案,或者更一般地说它只与REST概念相关).
所以我的疑问是:成功的DELETE语句的HTTP状态返回代码究竟是什么?
是204还是200?
我知道200意味着我的请求得到了正确的实现但是在线阅读在我看来,我希望它在成功获得GET返回内容之后而不是在删除之后.
在某处我发现204状态是在成功的PUT或DELETE之后获得的.这是真的吗?我无法理解,这意味着响应是空的,为什么空响应意味着PUT或DELETE操作成功了?
我无法理解204 HTTP状态代码的用例.RFC2616说:
10.2.5 204没有内容
服务器已完成请求但不需要返回实体主体,并且可能希望返回更新的元信息.所述
响应可包括以下形式的新的或更新的元信息
实体头,其如果存在的话应该与相关联
请求的变体.如果客户端是用户代理,它不应该从导致请求发送的文档视图中更改它的文档视图.这种反应主要是为了允许操作发生而不引起改变到用户代理的活动文档视图的输入,尽管任何新的或更新的元信息应在用户代理的活动视图当前应用于该文档.
204响应绝不能包含消息体,因此总是在头字段之后的第一个空行终止.
"文档视图"是指DOM吗?
例如,如果我的请求成功完成,我会触发删除用户的AJAX请求并更新我的页面以从列表中删除用户,如果服务器给我200作为响应的{}或没有的请求的204身体 ?
编辑:我主要关心的是"如果客户端是用户代理,它不应该从导致请求发送的文档视图中更改它".部分.用我自己的话来重新表述:如果我返回204,我可以更新DOM吗?
一个PUT请求,可以有很多的成果,我想知道它的状态代码将是最适合他们每个人.
假设我想创建一个新资源,所以我做了类似的事情:
PUT http://example.com/resources/resource-1
我会得到一个HTTP 201因为已经创建了一个新资源.
现在我想更新这个资源,所以我做了同样的请求,新的内容:
PUT http://example.com/resources/resource-1
我得到HTTP 200或者HTTP 204,因为资源已经更新.但是,如果我再次使用相同的内容发送此请求怎么办?服务器应该返回HTTP 200还是HTTP 204什么都没有更新?
我知道,HTTP 200和HTTP 204双方只是意味着该请求被成功处理,即使数据不改变请求可以(也应该)仍然可以成功处理.但有没有办法告诉客户端请求已成功处理但服务器端没有任何变化?如果有,是否应该用于PUT请求?PUT如果是幂等的,应该根据服务器端的实际处理返回不同的状态(只要在此处理过程中没有发生错误)?
我正在使用Jersey Framework(JAX-RS实现)来构建RESTful Web服务.
我无法使用@DELETE REST方法,因为它在我尝试调用它时抛出异常.以下@DELETE方法用于删除Employee:
@Path("/employees")
public class EmpResource {
@DELETE
@Consumes(MediaType.APPLICATION_JSON)
public Response deleteEmployee(JAXBElement<String> r) throws ClassNotFoundException, SQLException {
    String name = r.getValue();
    String response = DAOaccess.deleteEmp(name);
    return Response.noContent().build();    
}
我正在使用以下代码块来调用服务:
Client client = Client.create();
WebResource webResource = client.resource("http://localhost:8080/RestApp/sample/employees");
String input = "{\"name\":\"John\"}";
ClientResponse response = webResource.type(MediaType.APPLICATION_JSON).delete(ClientResponse.class,input);
当我运行我的客户端时,它会抛出以下异常:
Exception in thread "main" com.sun.jersey.api.client.ClientHandlerException: java.net.ProtocolException: HTTP method DELETE doesn't support output
at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:151)
at com.sun.jersey.api.client.Client.handle(Client.java:648)
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:680)
at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
at com.sun.jersey.api.client.WebResource$Builder.delete(WebResource.java:599)
如果有人可以指导我如何解决它会很棒吗?
rest ×8
http ×6
java ×3
http-delete ×2
jersey ×2
web-services ×2
jquery-1.9 ×1
post ×1
restlet ×1
rfc2616 ×1
spring ×1
spring-mvc ×1
web ×1