【发布时间】: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