代码之家  ›  专栏  ›  技术社区  ›  aboger yanki Boy

如何构造不需要主体的post请求

  •  6
  • aboger yanki Boy  · 技术社区  · 6 年前

    我有一个HTTP客户端发送了很多 POST 对服务器的请求。服务器响应所有请求时使用 201 Created 以及一个响应体。出于我的目的,响应头就足够了,因为我只对 Location 标题。我希望避免服务器产生响应主体,以便显著减少网络流量。

    根据 RFC 7231 ,…

      [...] if one or more resources has been created on the origin server as a
      result of successfully processing a POST request, the origin server
      SHOULD send a 201 (Created) response containing a Location header [...]
    

    …因此,我假设服务器也可以响应,例如 204 No Content 省略了身体。

    因此,我的问题是:是否可以构建一个 使服务器响应的请求 204无含量 或者以另一种方式省略响应主体?

    更新1:服务器端是一个SpringDataRest项目,我可以自由配置它。我知道我可以 RepositoryRestConfiguration#setReturnBodyOnCreate false 但这会影响到所有传入的请求,所以会有些过头。因此,我更愿意在客户方做出决定。

    4 回复  |  直到 6 年前
        1
  •  4
  •   Evert    6 年前

    除非您所使用的服务具有允许这样做的特定功能,否则没有真正的杠杆可以从客户端控制服务器是否会响应主体。

    服务器可能使用的头是 Prefer: return=minimal 但是,如果服务没有明确地记录对这一点的支持,那么这一点就不太可能奏效。

    实际上,客户唯一能做的就是:

    1. 收到响应头后立即终止TCP连接
    2. 在收到头时终止HTTP/2流。

    这是一个相当“激烈”的事情,但客户确实在某些情况下使用了这种机制,而且它确实起作用。但是,如果响应后的主体有点小,那么很可能它并没有真正产生很大的差异,因为响应可能已经发送了。

        2
  •  1
  •   Bertrand    6 年前

    不能只在客户端执行IT,因为它不是在SpringRestServer中本地实现的。

    无论如何,任何客户机需求都可以在请求中转换为额外的自定义头或查询参数。

    一种方法是 override default response handlers 并检测自定义头(实现 Prefer: return=minimal 如前所述)和/或查询参数是否存在以触发具有204状态的空响应。 This post may help you 去弄清楚。

        3
  •  0
  •   Ruchira Randana    6 年前

    你能试着改变你的客户吗?

    • a)使用HTTP HEAD请求而不是POST请求查询服务器
    • b)分析响应头。没有针对头请求的响应机构,因为头请求的目的与您的要求非常相似。
    • c)仅在需要时执行必要的岗位请求。

    我理解您可能在客户端难以应用这些更改。但从长远来看,我相信这是值得的。

        4
  •  0
  •   aboger yanki Boy    6 年前

    基于Evert和Bertrand的答案,再加上一些谷歌搜索,我最终在SpringDataRest服务器中实现了以下拦截器:

    @Configuration
    class RepositoryConfiguration {
    
        @Bean
        public MappedInterceptor preferReturnMinimalMappedInterceptor() {
            return new MappedInterceptor(new String[]{"/**"}, new HandlerInterceptor() {
                @Override
                public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
                    if ("return=minimal".equals(request.getHeader("prefer"))) {
                        response.setContentLength(0);
                        response.addHeader("Preference-Applied", "return=minimal"");
                    }
                    return true;
                }
            });
        }
    
    }
    

    它产生了以下通信,这对于我的目的来说已经足够好了:

    > POST /versions HTTP/1.1
    > Host: localhost:8080
    > User-Agent: curl/7.59.0
    > Accept: */*
    > Content-Type: application/json
    > Prefer: return=minimal
    > Content-Length: 123
    >
    > [123 bytes data]
    
    ...
    
    < HTTP/1.1 201
    < Preference-Applied: return=minimal
    < ETag: "0"
    < Last-Modified: Fri, 30 Nov 2018 12:37:57 GMT
    < Location: http://localhost:8080/versions/1
    < Content-Type: application/hal+json;charset=UTF-8
    < Content-Length: 0
    < Date: Fri, 30 Nov 2018 12:37:57 GMT
    

    我想平均分享奖金,但这是不可能的。这是伯特兰,因为他给出了一个答案,指导我真正实现。谢谢你的帮助。