标签: http-status-code-204

204无内容响应的改造,回调?

在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)

但是我从回调中得到了同样的错误.解决这个问题的正确方法是什么?谢谢.

android retrofit http-status-code-204

14
推荐指数
2
解决办法
8080
查看次数

Firefox控制台在HTTP 204响应中抛出"找不到元素"

一切确实有效,但我无法在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

11
推荐指数
1
解决办法
5842
查看次数

为什么Chrome会将"204 No Content"响应标记为红色?

我对Chrome非常困惑,它在请求列表中标记了一个"204 No Content"响应红色,但同时在"状态代码"中有一个绿点.我确定204不是错误,所以这里发生了什么?

我创建了一个新脚本以确保没有其他内容:

<?php

http_response_code(204);
Run Code Online (Sandbox Code Playgroud)

开发人员工具如下所示:

在此输入图像描述

我使用的是chrome 34.0.1847.116 m,顺便说一句,它在Firefox中并不是红色的.

google-chrome google-chrome-devtools http-status-code-204

8
推荐指数
0
解决办法
1018
查看次数

HTTP GET 200 与 204

我们正在设计一个公共 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

7
推荐指数
1
解决办法
1万
查看次数

如何在Nginx中为缺少的favicon.ico文件返回204而不是404?

对于我的网站,我通常有两个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)

nginx http-status-code-404 http-status-code-204

5
推荐指数
2
解决办法
4094
查看次数

Android Volley库没有使用204和空身反应

我正在使用最新的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,因为它尚不可用.相反,我正在连接到养蜂场上的模拟网络服务,但我不知道养蜂场是如何成为问题的.

android android-volley http-status-code-204

5
推荐指数
1
解决办法
2596
查看次数

Flask test_client 无法处理 HTTP 204 No data

我删除了端点,返回 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)

python testing flask http-status-code-204

5
推荐指数
1
解决办法
2270
查看次数

ASP.NET控制器操作返回状态代码200,但EndRequest将其作为204(NoContent)

在我的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修改响应代码,但我无法找到一个特定的过滤器来做它.

什么可能修改我的响应的状态代码,如何调试处理给定请求的所有过滤器?

c# asp.net asp.net-mvc action-filter http-status-code-204

5
推荐指数
1
解决办法
747
查看次数

MSIE / Edge使用HTTP HEAD作为&lt;object&gt;数据URL,然后将204响应视为错误?

背景:

我的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似乎合适。

惊喜1:

<object>元素具有data属性的URL时,MSIE / Edge最初会发出HTTP HEAD请求,以便通过响应标头确定内容类型。另一个MS怪癖是有道理的,因为它允许浏览器在接收内容之前预先加载所需的处理程序。当它收到对HEAD请求的适当响应时,它将为文件本身发出HTTP GET请求。

现在,如果不是因为这不是一个太大的问题...

惊喜2:

当MSIE / Edge收到对其HEAD请求的204响应时,它将其视为错误并中止加载文件。

不用说,这对发现(过程和发现本身)非常令人沮丧。

我是否误解了204响应的目的或用途?我知道行业用途经常与规格有所不同,但这似乎...是错误的。

html internet-explorer http http-status-code-204 microsoft-edge

4
推荐指数
1
解决办法
662
查看次数

Spring Boot Rest 中没有内容

当方法不获取记录时,如何配置 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

java rest spring-boot http-status-code-204

3
推荐指数
1
解决办法
3302
查看次数

正常看到状态 204 然后是状态 200?

我正在 chrome 的网络选项卡中查看我的 ajax 请求,我注意到我所做的每个 ajax 请求都发生了两次。

第一个是 204,然后是 200。我的 ajax 调用只被击中一次,所以我不确定为什么有 2 个。

编辑

所以这似乎与 Cors 有关,我刚刚将其设置为星号 (*) 以进行测试。

我想没有太多我可以不让它做 2 个请求,但真正让我着迷的是为什么它需要这么长时间,我看着谷歌浏览器网络,在我的页面上,这些 204 花费了 110 毫秒到 1.97 秒。

ajax http-status-code-200 http-status-code-204

3
推荐指数
2
解决办法
2594
查看次数

使用自定义HTTP代码进行Flask abort()

我在项目中使用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)

python exception flask http-status-code-204

1
推荐指数
1
解决办法
3313
查看次数