使用ClientResponse

时间:2018-01-01 23:23:29

标签: java rest jersey jersey-client

我正在尝试使用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对象而不是String。所以,我将代码更改为:

    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:找不到媒体类型= text / plain的MessageBodyReader,类型= class org.glassfish.jersey.client.ClientResponse,genericType = class org.glassfish.jersey.client。 ClientResponse。

为什么我会收到此异常?

1 个答案:

答案 0 :(得分:2)

您不能使用ClientResponse。您应该使用Response。当您希望响应实体自动反序列化时,您只需要使用.post()的第二个参数。如果您不使用第二个参数,则返回类型为Response。然后,您可以使用Response#readEntity()

读取实体的读取/反序列化
Response response = target
    .request(MediaType.TEXT_PLAIN)
    .post(Entity.form(form));

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