在Android上,我最初实现了一个像这样的Retrofit界面:
@DELETE(USER_API_BASE_URL + "/{id}")
public void deleteUser(@Path("id") String id, Callback<User> callback);
Run Code Online (Sandbox Code Playgroud)
成功删除后,服务器返回204 NO CONTENT.这导致回调触发失败,retrofit.RetrofitError: End of input at character 0 of因为它期望一个User对象返回响应.
我然后用这样重写它,Void而不是User:
@DELETE(USER_API_BASE_URL + "/{id}")
public void deleteUser(@Path("id") String id, Callback<Void> callback); <-- VOID
Run Code Online (Sandbox Code Playgroud)
但是我从回调中得到了同样的错误.解决这个问题的正确方法是什么?谢谢.
一切确实有效,但我无法在firefox控制台中摆脱这个错误:
找不到任何元素
我正在向我的api发送HTTP请求:
$http({
url: API_LOCATION + 'expenses/' + obj.expense.id + '/',
method: "DELETE",
}).then(function(response){
if(response.status === 204) {
var params = $location.search();
params['alert-success'] = ALERTS.EXPENSE_DELETED;
$location.search(params);
}
$route.reload();
});
Run Code Online (Sandbox Code Playgroud)
和我的(django rest框架)api返回HTTP_204_NO_CONTENT状态
javascript firefox httpresponse angularjs http-status-code-204
我对Chrome非常困惑,它在请求列表中标记了一个"204 No Content"响应红色,但同时在"状态代码"中有一个绿点.我确定204不是错误,所以这里发生了什么?
我创建了一个新脚本以确保没有其他内容:
<?php
http_response_code(204);
Run Code Online (Sandbox Code Playgroud)
开发人员工具如下所示:

我使用的是chrome 34.0.1847.116 m,顺便说一句,它在Firefox中并不是红色的.
我们正在设计一个公共 API,并试图找出以下情况下 GET 的最佳实践:
路径参数:
/orders/{orderId}
Run Code Online (Sandbox Code Playgroud)
发现:200 个带有响应正文。
未找到:404。
查询参数:
/Products/{productId}/orders?color={color}
Run Code Online (Sandbox Code Playgroud)
找到的订单:200 个,带响应正文。
未找到:在这种情况下应该是 200 还是 204,甚至是 404?
在我看来,应该是200或204,因为本例中找到了资源,并且查询参数只是执行过滤效果。但在这种情况下我们应该返回 200 还是 204 呢?
rest http http-status-code-404 http-status-code-200 http-status-code-204
对于我的网站,我通常有两个server{}块:一个为网站服务,另一个为来自不同域的该网站提供静态内容.因为favicon.ico总是从主域而不是静态域请求文件,所以我必须处理站点server{}块中的特定文件而不是静态文件块.
当favicon.ico找不到文件,Nginx将返回我的定义404错误页面,以及404 HTTP状态代码.但是,我不想为我漂亮的404页面发送这些内容.我想用204状态代码发送一个完全空的响应.以下是我尝试过的,但它不起作用.有没有正确的方法来做到这一点?想法是204表示找到的文件,但是完全空白的图像.
另外,我试图节省比特实际上是个坏主意吗?实际上,如果返回204而不是404是一个坏主意,是否有更优雅的方法来返回空的404页面而不创建一个新的实际空文件并将其设置error_page为该位置块内的指令?
server {
...
error_page 404 /../static/404.html;
location @return_204 {
return 204;
}
# Case-insensitive matching of .txt and .xml files.
# (Example: robots.txt, crossdomain.xml, and sitemap.xml)
location ~* \.(txt|xml)$ {
try_files $uri /../static/$uri;
}
location = /favicon.ico {
log_not_found off;
error_page 404 = @return_204;
try_files $uri /../static/$uri;
}
...
}
Run Code Online (Sandbox Code Playgroud) 我正在使用最新的Volley库,当我的api返回204而没有响应的身体时,我遇到了问题.似乎BasicNetwork.java中的以下代码未按预期工作:
// Some responses such as 204s do not have content. We must check.
if (httpResponse.getEntity() != null) {
responseContents = entityToBytes(httpResponse.getEntity());
} else {
// Add 0 byte response as a way of honestly representing a
// no-content request.
responseContents = new byte[0];
}
Run Code Online (Sandbox Code Playgroud)
getEntity的结果对我来说永远不会为null,但它是空的.我已经确保我的API没有通过检查卷发和邮递员返回任何内容(只是为了更加确定我不会发疯).还有其他人有这样的问题吗?
现在我刚刚改变了,如果:
if (statusCode != HttpStatus.SC_NO_CONTENT && httpResponse.getEntity() != null)
Run Code Online (Sandbox Code Playgroud)
我知道这不是解决根本原因,但我想确保在深入研究这个问题之前我没有遗漏任何明显的东西.
谢谢!
编辑:对不起,我忘了提到实际问题是在方法entityToBytes中发生超时异常,这很奇怪,因为没有要检索的主体.
此外,我没有使用实际功能齐全的webservice API,因为它尚不可用.相反,我正在连接到养蜂场上的模拟网络服务,但我不知道养蜂场是如何成为问题的.
我删除了端点,返回 HTTP 204
@blueprint.route('/foo', methods=['DELETE'])
def delete_tag(id):
# ....
return '', 204
Run Code Online (Sandbox Code Playgroud)
我想测试一下
def test_delete_tag(self):
resp = self.client.delete(url_for('tags.delete_tag', id=1))
self.assertEqual(resp.status_code, 204)
Run Code Online (Sandbox Code Playgroud)
但我有例外
Traceback (most recent call last):
File "tests/tags_test.py", line 31, in test_delete_tag
resp = self.client.delete(url_for('tags.delete_tag', id=1)})
File ".virtualenvs/...site-packages/werkzeug/test.py", line 799, in delete
return self.open(*args, **kw)
File ".virtualenvs/...site-packages/flask/testing.py", line 108, in open
follow_redirects=follow_redirects)
File ".virtualenvs/...site-packages/werkzeug/test.py", line 742, in open
response = self.run_wsgi_app(environ, buffered=buffered)
File ".virtualenvs/...site-packages/werkzeug/test.py", line 659, in run_wsgi_app
rv = run_wsgi_app(self.application, environ, buffered=buffered)
File ".virtualenvs/.../site-packages/werkzeug/test.py", line 885, in run_wsgi_app …Run Code Online (Sandbox Code Playgroud) 在我的ASP.NET MVC应用程序控制器中处理请求并返回具有状态代码的特定视图200.当它到达Application_EndRequest它已经204.我的视图的响应内容是正确的并且在响应中,因此仅修改状态代码.这是一个例子(状态是204,但内容在那里):
HTTP/1.1 204 No Content
Cache-Control: no-cache
Pragma: no-cache
Content-Type: text/html; charset=utf-8
Expires: -1
Vary: User-Agent
Access-Control-Allow-Origin: *
Date: Fri, 24 Nov 2017 22:12:17 GMT
Run Code Online (Sandbox Code Playgroud)
它可能是ActionFilter修改响应代码,但我无法找到一个特定的过滤器来做它.
什么可能修改我的响应的状态代码,如何调试处理给定请求的所有过滤器?
我的PHP代码通过发送HTTP状态404响应或204响应来处理典型的HTTP HEAD请求。这对我来说似乎是正确的,因为RFC7231将HTTP状态204指定为:
6.3.5。204没有内容
状态码204(无内容)指示服务器已成功满足请求,并且响应有效内容正文中没有其他要发送的内容。应用请求的操作后,响应头字段中的元数据引用目标资源及其选择的表示形式。
204响应允许服务器指示该操作已成功应用于目标资源,同时暗示用户代理不需要遍历其当前“文档视图”(如果有)...
204响应由标头字段之后的第一个空行终止,因为它不能包含消息正文...
https://tools.ietf.org/html/rfc7231#section-6.3.5
由于用户代理仅请求标头而不是文件本身,因此204似乎合适。
当<object>元素具有data属性的URL时,MSIE / Edge最初会发出HTTP HEAD请求,以便通过响应标头确定内容类型。另一个MS怪癖是有道理的,因为它允许浏览器在接收内容之前预先加载所需的处理程序。当它收到对HEAD请求的适当响应时,它将为文件本身发出HTTP GET请求。
现在,如果不是因为这不是一个太大的问题...
当MSIE / Edge收到对其HEAD请求的204响应时,它将其视为错误并中止加载文件。
不用说,这对发现(过程和发现本身)非常令人沮丧。
我是否误解了204响应的目的或用途?我知道行业用途经常与规格有所不同,但这似乎...是错误的。
html internet-explorer http http-status-code-204 microsoft-edge
当方法不获取记录时,如何配置 Spring Boot 以在 GET 方法(通常是 findAll 方法)中返回 204?我不想在每种方法中都做处理,键入下面的代码:
if(!result)
return new ResponseEntity<Void>(HttpStatus.NO_CONTENT);
return new ResponseEntity<Void>(HttpStatus.OK)
Run Code Online (Sandbox Code Playgroud)
我想改变这个方法:
@GetMapping
public ResponseEntity<?> findAll(){
List<User> result = service.findAll();
return !result.isEmpty() ?
new ResponseEntity<>(result, HttpStatus.OK) : new ResponseEntity<Void>(HttpStatus.NO_CONTENT);
}
Run Code Online (Sandbox Code Playgroud)
在这个:
@GetMapping
public List<User> findAll(){
return service.findAll();
}
Run Code Online (Sandbox Code Playgroud)
如果findAll()的结果为空或 null,那么我的控制器应该返回204而不是200。
我正在 chrome 的网络选项卡中查看我的 ajax 请求,我注意到我所做的每个 ajax 请求都发生了两次。
第一个是 204,然后是 200。我的 ajax 调用只被击中一次,所以我不确定为什么有 2 个。
编辑
所以这似乎与 Cors 有关,我刚刚将其设置为星号 (*) 以进行测试。
我想没有太多我可以不让它做 2 个请求,但真正让我着迷的是为什么它需要这么长时间,我看着谷歌浏览器网络,在我的页面上,这些 204 花费了 110 毫秒到 1.97 秒。
我在项目中使用Flask框架和纯json api。它仅呈现json响应,而没有html或静态文件。
我正在尝试使用自定义的http代码来实现abort()函数,在我的情况下,默认情况下未定义204(无内容)。我目前有类似的代码:
# Error define
class NoContent(HTTPException):
code = 204
description = ('No Content')
abort.mapping[204] = NoContent
def make_json_error(ex):
response = jsonify(error=str(ex))
response.status_code = (ex.code
if isinstance(ex, HTTPException)
else 500)
return response
custom_exceptions = {}
custom_exceptions[NoContent.code] = NoContent
for code in custom_exceptions.iterkeys():
app.error_handler_spec[None][code] = make_json_error
# Route
@app.route("/results/<name>")
def results(name=None):
return jsonify(data=results) if results else abort(204)
Run Code Online (Sandbox Code Playgroud)
它收到如下响应时效果很好:
127.0.0.1 - - [02/Dec/2014 10:51:09] "GET /results/test HTTP/1.1" 204 -
Run Code Online (Sandbox Code Playgroud)
但是没有任何内容。它不会呈现任何内容,甚至不会在浏览器中呈现空白白页。
我可以使用错误处理程序
@app.errorhandler(204)
def error204(e):
response = jsonify(data=[])
return response …Run Code Online (Sandbox Code Playgroud) android ×2
flask ×2
http ×2
python ×2
rest ×2
ajax ×1
angularjs ×1
asp.net ×1
asp.net-mvc ×1
c# ×1
exception ×1
firefox ×1
html ×1
httpresponse ×1
java ×1
javascript ×1
nginx ×1
retrofit ×1
spring-boot ×1
testing ×1