使用 ClientResponse 发布时 Jersey 客户端 MessageBodyProviderNotFoundException

Jersey client MessageBodyProviderNotFoundException when posting using ClientResponse

我正在尝试使用 Jersey 客户端调用 REST 服务(不使用 Jersey / JAX-RS)。以下代码适用于 POST 我的表单数据并收到响应:

    Form form = new Form();
    form.param("email", email);
    form.param("password", password);

    String clientResponse =
            target.request(MediaType.TEXT_PLAIN)
                    .post(Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED_TYPE),
                          String.class);

代码 运行 没问题,clientResponse 变量包含来自服务器的纯文本响应。

现在,我需要检查服务器返回的状态码。据我了解,我需要将响应检索为 ClientResponse 对象而不是字符串。所以,我将代码更改为:

    Form form = new Form();
    form.param("email", email);
    form.param("password", password);

    ClientResponse clientResponse =
            target.request(MediaType.TEXT_PLAIN)
                    .post(Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED_TYPE),
                          ClientResponse.class);

当我 运行 这个新代码时,我得到以下异常:

org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=text/plain, type=class org.glassfish.jersey.client.ClientResponse, genericType=class org.glassfish.jersey.client.ClientResponse.

为什么我会收到此异常?

您没有使用 ClientResponse。你应该使用 Response。而当你想让响应实体自动反序列化时,只需要使用.post()的第二个参数即可。不使用第二个参数时,return类型为Response。然后你可以用 Response#readEntity()

读取 read/deserialize 实体
Response response = target
    .request(MediaType.TEXT_PLAIN)
    .post(Entity.form(form));

String data = response.readEntity(String.class);