Java Vertx无法使用webClient为我的帖子请求提供用户ID密码

时间:2019-02-17 01:31:34

标签: java vert.x

我是Java和Vert.x的新手 我正在使用vertx 3.5.3 我正在尝试实现基本身份验证,以便可以在发送发布请求之前登录到远程服务器 我尝试了下面的代码,它给出了编译器错误。 我收到了编译器错误。

对于类型HttpRequest而言,方法basicAuthentication(String,String)是未定义的。我在做什么错了。

要求是我需要使用JSON Post正文(使用Vert.x Web客户端)通过发帖请求为远程服务器和访问端点发送用户ID和密码

我尝试了以下代码

package com.aexp.csrt.qs.cb.resources;
import com.aexp.csrt.qs.models.cb.passTrou.SourceQueryModel;
import io.vertx.reactivex.ext.web.RoutingContext;
import io.vertx.reactivex.core.Vertx;
import io.vertx.ext.web.client.WebClient;
import io.vertx.ext.web.client.WebClientOptions;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.client.HttpResponse;
import io.vertx.core.buffer.Buffer;

public class QueryExecutorFTS implements QueryExecutor {
    private WebClient webClient;

    @Override
    public void executeQuery(SourceQueryModel Qm, RoutingContext rc) {

        WebClientOptions options = new WebClientOptions().setMaxPoolSize(10).setConnectTimeout(5000)
                .setVerifyHost(false);

        JsonObject jreq = new JsonObject(Qm.getSourceQuery().getSourceDsl().getQuery());

        Vertx vertx = rc.vertx();
        webClient = WebClient.create(vertx.getDelegate(), options);

         webClient
         .basicAuthentication("myid", "mypassword")
        .post(8094, "lpdospdb51079.phx.aexp.com", "/api/index/Text_search_name_idx/query")
        .sendJsonObject(jreq,
                ar -> {
                    if (ar.succeeded()) {
                        HttpResponse<Buffer> response = ar.result();
                        rc.response().setStatusCode(200).end(response.bodyAsString());
                    } else {
                        ar.cause().printStackTrace();
                        rc
                              .response()
                              .setStatusCode(500)
                              .setStatusMessage(ar.cause().getMessage())
                              .end();
                    }
                })
        ;


    }

}

1 个答案:

答案 0 :(得分:0)

假设您像这样使用服务器端的会话处理程序:

    router.route().handler(CookieHandler.create());
    router.route().handler(SessionHandler.create(LocalSessionStore.create(vertx)));
    router.route().handler(UserSessionHandler.create(authProvider));

您现在需要首先使用您定义的登录网址来验证客户端。

您的登录路径-> / login

    router.route(HttpMethod.POST, path)
        .handler(FormLoginHandler.create(authProvider));

您通常发布用户信息/通过JSON

现在在客户端,您需要执行两个步骤

  1. 将您的凭据发布到登录URL

    MultiMap form = MultiMap.caseInsensitiveMultiMap();
    form.add("username", user);
    form.add("password", password);
    
    client
        .post(port, "localhost", "/login")
        .putHeader("content-type", "multipart/form-data")
        .sendForm(form, ar -> {
            if (ar.succeeded()) {
                log.info("RESOURCES: {}", ar.result().bodyAsString());
                log.info("COOKIES: {}", ar.result().cookies());//.getHeader("vertx-web.session"));
                ar.result().cookies().stream().filter(c -> c.startsWith("vertx-web.session")).findFirst().ifPresent(s -> {
                    // do something with the session cookie - >cookie.accept(s.substring(0, s.indexOf(";")));
                });
            } else {
                log.error("Something went wrong", ar.cause());
            }
        });
    
  2. 一旦有了cookie,便可以再次调用服务器。

        client.
            .get(port, "localhost", "/resource")
            .putHeader("Cookie", cookie)
            .send(ar -> { ...