当前位置: 首页 > 知识库问答 >
问题:

当我试图使用VERTX HTTP客户端获取数据时,它会给我null

宁鹏程
2023-03-14

嗨,有人能看看吗:

当我尝试使用VERTX HTTP客户端获取数据时,它在最后一行中给了我空指针异常,并且当我使用java HTTP客户端时,相同的URL提供了数据

HttpClientOptions options = new HttpClientOptions().setKeepAlive(false);

options.setLogActivity(true);    
options.setDefaultHost("http://delvmpllbbab10");
options.setDefaultPort(7003);

HttpClient client = vertx.createHttpClient(options);
HttpClientResponse[] clientResponse = {null};

client.request(HttpMethod.GET, "/rcsservices/homePage", response -> {
    System.out.println("Received response with status code " + response.statusCode());

    clientResponse[0] = response;

}).putHeader("content-type", "application/json").end(clientResponse[0].toString());

是这个代码我有一些问题...

共有2个答案

沙海
2023-03-14

我在开始使用Vert-X framework时遇到了同样的问题,我可以从您的代码中注意到以下改进:

  1. 您必须使用HttpClientACK的body Handler处理响应,然后您不能输入外部变量,除非最终
  2. 为了不阻塞调用线程,最好使用asyncACK,尤其是如果您依赖外部系统(在您的情况下是另一个Web服务)
  3. 我不确定您是否要提供正文,请求处的. end()包含新的“客户端请求正文”,但当您进行GET时,正文必须为空
  4. 尝试使用标准的HttpHeadersMediaType(我个人使用来自JAX-RS的MediaType)而不是编写自己的字符串。
  5. 尝试使用适当的记录器代替System.out.println(...)

以下代码显示了如何将响应返回给原始调用方:

public void callWebService(@Context HttpServerRequest request, @Suspended final AsyncResponse asyncResponse) {

    HttpClientOptions options = new HttpClientOptions().setKeepAlive(false);

    options.setLogActivity(true);    
    options.setDefaultHost("http://delvmpllbbab10");
    options.setDefaultPort(7003);

    HttpClient client = vertx.createHttpClient(options);

    client.request(HttpMethod.GET, "/rcsservices/homePage", response -> {

        System.out.println("Received response with status code " + response.statusCode());
        int code = response.statusCode();
        if (code == 200) {
            response.bodyHandler(bufferResponse -> {
                // Adapt according your response type, could be String as well
                JsonObject httpResult = bufferResponse.toJsonObject();
                System.out.println("Received HTTP response with body " + httpResult);
                asyncResponse.resume(Response.ok(httpResult).build());
            });
        } else {

            response.bodyHandler(bufferResponse -> {
                // Return null in a JSON Object in case of error
                String httpResult = "{null}";
                asyncResponse.resume(Response.status(code).entity(httpResult).build());
            });
        }

}).putHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON).end();

做同样的事情有很多方法,你可以查看官方手册页面。

孟璞
2023-03-14

这是正确的,您将得到一个NPE,因此在您的代码中,您使用{null}初始化clientResponse变量。如果您现在了解代码的执行方式,您将看到原因:

  1. 创建请求对象:<代码>客户端。请求(

现在您看到,clientResponse[0]仍然为null(这是您初始化它的值。因此,您正在调用

null.toString()

这是无效的,并且将始终引发空指针异常。

 类似资料:
  • 所以我只想使用谷歌云视觉应用编程接口从图像中检测文本或标签。但是当我运行这段代码时,我总是得到: 但我不知道为什么。。。下面是我得到的完整json输出: 我的测试代码如下: 所以问题是。。此代码有什么问题?

  • 我有一个主类,在那里初始化实例。然后,在getter的帮助下,我想从另一个类获取相同的实例,然而,它抛出了一个空指针异常。 其他类:

  • 我正在使用Firebase云功能与Express和Firebase托管来为我的多页面站点服务。我已经成功地实现了服务器端cookie,如下文所述: 我正在使用Firebase Web SDK(JavaScript)访问Firebase Cloud Firestore。为此,我需要在客户端为当前登录的用户获取idToken,如下所示: 这对我来说似乎是多余的,因为我已经知道哪个用户是通过我的服务器c

  • CalledProcessError:Command'['java','-Dfile.encoding=UTF8','-jar',C:\Users\vijv2c13136\AppData\Local\Continuum\anaconda2\lib\site packages\tabla\tabla-1.0.2-jar-with-dependencies.jar','-pages',all','-g

  • Pease帮帮我!,我是新来的flutter我正在导入一个项目,当我试图运行它时,它给出了异常 /simple_permissions-0.1.9/android/src/main/java/com/ethras/simplepermissions/simplepermissionsplugin.java:9:错误:找不到符号导入Android.support.v4.app.activitycom

  • WebDriverException在处理命令时发生未知的服务器端错误。(警告:服务器未提供任何stacktrace信息) 在sun.reflect.nativeconstructoraccessorimpl.newinstance0(本机方法)在sun.reflect.nativeconstructoraccessorimpl.newinstance(nativeconstructoracces