You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Jersey客户端调用REST接口返回HTML而非JSON故障求助

解决Jersey客户端调用REST接口返回HTML而非JSON的问题

看起来你遇到的问题很典型——工具调用正常但代码里返回HTML,大概率是请求头或者客户端配置的问题,我来帮你梳理几个排查方向:

1. 确保Jersey客户端发送了正确的Accept请求头

Postman/ARC这类工具会自动帮你添加Accept: application/json请求头,但Jersey客户端默认可能不会。服务器如果没收到这个头,可能会返回默认的HTML格式(比如错误页面或者默认视图)。

你可以在客户端请求里明确指定这个头:

Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://你的API地址/userJSON2/" + preRegisterId);
// 明确要求接受JSON格式
Response response = target.request(MediaType.APPLICATION_JSON)
                          .get();
// 解析响应为目标对象
PreRegisterJsonResponse result = response.readEntity(PreRegisterJsonResponse.class);

2. 检查Jersey客户端是否注册了JSON提供者

如果你的客户端没有配置JSON处理的提供者,不仅无法正确解析JSON响应,服务器也可能因为识别不到客户端支持的格式而返回HTML。你需要注册Jackson的JSON提供者(假设项目用Jackson处理JSON):

ClientConfig config = new ClientConfig();
// 注册Jackson JSON提供者
config.register(JacksonJaxbJsonProvider.class);
Client client = ClientBuilder.newClient(config);

如果是Maven项目,记得添加对应的Jersey JSON依赖:

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>你的Jersey版本号</version>
</dependency>

3. 给接口明确添加produces属性

虽然你用了@ResponseBody,但给@RequestMapping加上produces属性可以强制服务器只返回JSON,避免格式歧义:

@GET
@ResponseBody
@RequestMapping(value = "/userJSON2/{preRegisterId}", produces = MediaType.APPLICATION_JSON_VALUE)
public PreRegisterJsonResponse userJson2(@PathVariable long preRegisterId) {
    // 你的业务逻辑代码
}

4. 先排查返回的HTML具体内容

把返回的HTML打印出来看看,说不定是404路径错误、参数类型不匹配导致的500错误页面?比如你代码里传递的preRegisterId格式不对,或者路径拼接有误:

Response response = target.request(MediaType.APPLICATION_JSON).get();
String htmlContent = response.readEntity(String.class);
System.out.println(htmlContent); // 打印HTML内容,定位具体问题

按照这几个步骤排查,应该能快速定位并解决问题~

内容的提问来源于stack exchange,提问作者Mithilesh Tipkari

火山引擎 最新活动