【问题标题】:HTTP Request in Python VS. Apache Camel?Python VS 中的 HTTP 请求。阿帕奇骆驼?
【发布时间】:2022-01-25 06:32:55
【问题描述】:

我正在将 Python 脚本转换为 Camel。 此脚本连接到包含登录表单的 HMTL,执行 GET 请求。

然后它从响应中提取标头参数,将它们添加到 POST 请求中,同时添加包含凭据的有效负载,最后提交请求。

r = requests.get(self.base_url, proxies=self.proxy, verify=self.verify_ssl)
cookie_string = r.headers.get('set-cookie')
temp_headers = {"Cache-Control": 'no-cache', "cookie": cookie_string}
connection_payload = {'email': self.username, 'password': self.password}
r = requests.post(self.base_url, headers=temp_headers, data=connection_payload, proxies=self.proxy, verify=self.verify_ssl)

这段代码运行良好。

在它的Java版本中,我试过了:


public class WebRoute extends RouteBuilder {

    final HttpComponent httpComponent = createHttpComponent();
    final Endpoint loginEndpoint = httpComponent.createEndpoint(WEBAPI_AUTH_URI_LOGIN);

    @Override
    public void configure() throws Exception {

        from("direct:login")
        .setHeader(Exchange.HTTP_METHOD, HttpMethods.POST)
        .setHeader(Exchange.CONTENT_TYPE, constant(MediaType.APPLICATION_FORM_URLENCODED_VALUE))
        .setHeader(Exchange.HTTP_QUERY, simple("email=${body.username}&password=${body.password}"))
        .to(loginEndpoint);
    }

    private HttpComponent createHttpComponent() {
        HttpComponent httpComponent = getCamelContext().getComponent(PROXY_SCHEME, HttpComponent.class);
        httpComponent.setSslContextParameters(sslContextParameters);
        httpComponent.setUseGlobalSslContextParameters(true);
        httpComponent.setProxyAuthScheme(PROXY_SCHEME);
        httpComponent.setProxyAuthHost(PROXY_HOST);
        httpComponent.setProxyAuthPort(PROXY_PORT);
        httpComponent.setCookieManagementDisabled(true);
        return httpComponent;
    }
}

问题不在于使用 SSL 证书的 http 组件配置。 它运行良好(传递代理并获取包含我尝试登录的表单的响应),只是提到它,因为它也是我用来发出 POST 请求的端点。

问题

使用上面的 Java 代码,服务器响应:

HTTP operation failed invoking https://a.b.c?user=x@y.z&password=xxxxxx with statusCode: 400

我很确定问题与我传递凭据的方式有关:

.setHeader(Exchange.HTTP_QUERY, simple("email=${body.username}&password=${body.password}"))

尝试了它的许多变体,例如使用“RAW(密码)”没有成功。

问题

如何在 Camel 中重写上面的 Python 查询,特别是 connection_payload 参数部分?

【问题讨论】:

    标签: python-3.x forms apache-camel java-11


    【解决方案1】:

    您确定密码和用户名应该存储在正文中吗?属性或标题似乎是一个更好的地方。因为现在您还将在请求正文中发送这些数据。

    此外,在您的示例中,您使用了两个不同的字段:用户和电子邮件。这可能是您的主要问题。

    .setHeader(Exchange.HTTP_QUERY, simple("user=${header.username}&password=${header.password}"))

    如果您要使用不同的用户名和密码,也可以使用 .toDdynamically set the endpoint

    .toD("http:myloginserver:8080/login?user=${header.username}&password=${header.password}")

    【讨论】:

    • 嗨。它不存储在正文中,而是作为查询参数附加到 url。至于toD,我也试过了,可惜没有成功
    • 您看到我对这两个不同字段名称的评论了吗?您发送了一个email 字段,但服务器响应要求提供user
    • 是的。但在这种情况下,这是正常的:包含凭证的 bean 有一个“用户名”字段,而服务器使用电子邮件字段。 Python 也在做同样的切换,Python 脚本工作
    猜你喜欢
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 2013-02-09
    • 2018-11-27
    相关资源
    最近更新 更多