【问题标题】:Can we uniquely identify request to send respond from a POST method?我们可以唯一标识从 POST 方法发送响应的请求吗?
【发布时间】:2021-06-26 23:44:31
【问题描述】:

我正在开发一个异步的网络服务。在我的客户端代码中,我使用boto3 session client 来调用我的 Jetty 服务器的 GET API,这是 S3 类似的服务。 GET API 从 S3 获取原始数据并修改请求以便能够将请求转发到烧瓶服务器。然后 Python 烧瓶处理请求(完成数据转换)并调用 Jetty Server 的 POST API。

现在我一直在想如何回复原来的来电者?因为我不确定一个 API 请求是否可以有一个 session-id 来识别原始调用者?

我的 POST API 如何响应客户端?以下是我想要实现的总体概念。我该怎么做?

【问题讨论】:

  • 我不明白您为什么会从 GET 请求触发 POST 请求。这本身看起来像糟糕的设计,但我也没有得到那个 POST 请求甚至需要做什么?为什么 Flask Server 会创建自己的请求,而不是响应来自 Jetty Server 的初始请求?
  • @Tom 我需要异步完成这项工作,因为我正在尝试重新创建自己的 S3 对象 lambda 服务。 Flask Server 的 lambda 函数转换数据,然后调用我的 Jetty 服务器的 POST api。这个 POST API 是 writeGetObjectResponse(),然后需要响应来自客户端的原始请求。我正在尝试在我自己的环境中重现 AWS 服务。如果我需要更清楚地说明这一点,请告诉我。
  • HTTP 请求不是异步的。原始 GET 请求必须阻塞,直到您准备好发送响应。你不能推迟它并在以后完成它。它会等着你。
  • @TimRoberts 是的,我想我现在理解了那部分。但是我对如何从 writeGetObjectResponse() 发送对原始 GET 请求的响应感到困惑?是否有一个请求标识符机制,API 将通过它知道在哪里响应?还是我完全看错了?
  • 这样想。如果原始客户端请求由您的 Flask 应用程序处理,那么您将在 Python 函数中收到请求。该函数最终必须返回一个字符串。这就是它的人生目的。您必须弄清楚如何构造该字符串。您可以调用创建该字符串所需的任何外部服务。

标签: java python rest jax-rs flask-restful


【解决方案1】:

由于我使用的是嵌入式 Jetty,所以我使用了内置的org.eclipse.jetty.server.HttpChannel.Listener

我现在可以访问包含该请求的 HTTP 字段的原始内部 Jetty org.eclipse.jetty.server.Request 对象。

要使用它,我将创建 HttpChannel.Listener 的一个实例,并将其作为 bean 添加到我的连接器中。

public class RequestChannelListener implements HttpChannel.Listener {
    @Override
    public void onRequestBegin(Request request) {
        HttpFields.Mutable replacement = HttpFields.build(request.getHttpFields())
                .put("X-Request-ID", UUID.randomUUID().toString().toUpperCase());
        request.setHttpFields(replacement);
    }
}

在连接器中添加为 bean -

RequestChannelListener channelListener = new RequestChannelListener();
connector.addBean(channelListener);

然后对该请求的所有其他访问,无论是 Jetty 的内部组件、webapp、特定的 servlet、过滤器、转发、包含、servlet 规范中的错误处理、servlet 上下文之外的错误处理等,都可以看到它。

检查自定义标头是否已添加到请求中 -

Enumeration<String> headerNames = request.getHeaderNames();
        while(headerNames.hasMoreElements()) {
            String headerName = headerNames.nextElement();
            System.out.println("Header Name - " + headerName + ", Value - " + request.getHeader(headerName));
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 2023-02-20
    • 2021-03-30
    • 1970-01-01
    • 2012-09-22
    • 2020-05-31
    • 2020-06-09
    相关资源
    最近更新 更多