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

RESTful Api-Spring media type vs Restlet media type

乐修远
2023-03-14

我有一个REST客户:

import org.restlet.representation.ObjectRepresentation;
import org.restlet.data.MediaType;

ObjectRepresentation<ApprovalResponse> objectRepresentation = (ObjectRepresentation<ApprovalResponse>) cr.post(approvalRequest, MediaType.APPLICATION_JAVA_OBJECT);

和一个 Spring Boot Service RESTful api:

import org.springframework.http.MediaType;

@PostMapping(value = "/rest/approvals-submit")
public @ResponseBody ApprovalResponse submit(@RequestHeader(name="Authorization") String token, @RequestBody ApprovalRequest approvalRequest) {
    System.out.println("jwt token: "+token);
    System.out.println(approvalRequest.getMessageToEvaluator());
    ApprovalResponse approvalResponse = new ApprovalResponse();
    approvalResponse.setApprovalId("Test approvalResponse from micro service");
    return approvalResponse;
}

客户端调用 API 成功。即 System.out.println(approvalRequest.getMessageToEvaluator()); 成功打印出来。

问题

我的问题是响应html" target="_blank">对象没有返回到REST客户端。

错误消息

Rest客户端

org.restlet.resource。ResourceException:不可接受(406)-请求所标识的资源只能生成响应实体,这些响应实体的内容特征根据请求中发送的接受标头是不可接受的

服务器/Api

已解决的[org.springframework.web.HttpMediaTypeNotAccepable异常:找不到可接受的表示]

问题

所以我认为这些错误是因为没有正确定义MediaTypes。你知道他们应该被定义为什么吗?

共有1个答案

余阳秋
2023-03-14

我们在restendpoint的postMapping注释上添加了以下内容:

@PostMapping(value = "/rest/approvals-submit")
public @ResponseBody ApprovalResponse submit(@RequestHeader(name="Authorization") String token, @RequestBody ApprovalRequest approvalRequest, produces={MediaType.APPLICATION_JSON_VALUE,
MediaType.APPLICATION_XML_VALUE},consumes = MediaType.APPLICATION_JSON_VALUE) {
    System.out.println("jwt token: "+token);
    System.out.println(approvalRequest.getMessageToEvaluator());
    ApprovalResponse approvalResponse = new ApprovalResponse();
    approvalResponse.setApprovalId("Test approvalResponse from micro service");
    return approvalResponse;
}

添加到@PostMapping批注上的这一内容产生={MediaType。应用程序_JSON_VALUE,媒体类型。APPLICATION_XML_VALUE},consumes = MediaType。应用程序_JSON_VALUE。

在客户端,我们将响应类型更改为表示,并且我们能够得到json响应:

ClientResource cr = new ClientResource(endpointUrl);
ChallengeResponse challengeResponse = new ChallengeResponse(ChallengeScheme.HTTP_OAUTH_BEARER);
challengeResponse.setRawValue(token);
cr.setChallengeResponse(challengeResponse);

Request req = cr.getRequest();

Representation representation = cr.post(approvalRequest);
System.out.println(representation.getText());

最后,使用Jackson Object Mapper,可以将响应映射到Approval响应对象:

    // now convert the response to java
    ObjectMapper objectMapper = new ObjectMapper();
    ApprovalResponse approvalResponse = objectMapper.readValue(json, ApprovalResponse.class);
    System.out.println(approvalResponse);
    System.out.println(approvalResponse.getApprovalId());

这是一个内容谈判问题。内容协商是通过内容类型标头完成的,为了更好地理解它,您可以阅读此博客文章

 类似资料:
  • thinkphp5编写的restful风格的API,集API请求处理,权限认证,自动生成文档等功能

  • 本文向大家介绍Django JWT Token RestfulAPI用户认证详解,包括了Django JWT Token RestfulAPI用户认证详解的使用技巧和注意事项,需要的朋友参考一下 一般情况下我们Django默认的用户系统是满足不了我们的需求的,那么我们会对他做一定的扩展 创建用户项目 添加项目apps settings.py 编写model 扩展User model 编写seria

相关问答

相关文章

相关阅读

相关工具