【问题标题】:Encode Response in REST service在 REST 服务中编码响应
【发布时间】:2017-09-28 10:45:02
【问题描述】:

我在服务方法中使用 javax.ws.rs.core.Response 类:

@GET
@Path("/object/{id}")    
@Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response findObject(@Context HttpHeaders headers,
                                 @PathParam("id") String objectId) {
    Object object = getObject(objectId);
    return createResponse(object, headers);
}

private Response createResponse(Object object, HttpHeaders headers) {
    Response.ResponseBuilder responseBuilder = Response
            .ok()
            .entity(object)
            .type(MediaType.APPLICATION_JSON_TYPE)
            .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
            .build();
}

我的系统的Response 内容层次结构实例包含在实例object 中。这是具有所有子对象及其属性的对象。我想在object 中编码属性值。例如,我需要在响应中给出百分比编码符号而不是名称中的空格。我需要对整个响应进行编码,包括所有字段。根据UTF-8编码。例如,我需要在我的回复中包含 'His20%name%3A20%John' 而不是某些字段的值 'His name: John'。同样,对于整个层次结构中的所有字段,无一例外。

我没有发现比使用 URLEncoder.encode(String s, String enc) 方法手动处理每个字段更好的方法:

fieldValue = URLEncoder.encode(fieldValue, "UTF-8");

但在这种情况下,我需要手动遍历层次结构中所有响应的对象中的所有字段。也许有更标准和正确的方法来做到这一点?

有些字段不是字符串,例如类型为 BigDecimal。它们可以包含分隔符。我该如何处理它们?有没有办法在返回之前对整个对象响应进行编码?

【问题讨论】:

  • 您想将编码数据存储在 json 中?
  • 是的,我使用 JSON 格式进行响应。

标签: java json rest jackson jax-rs


【解决方案1】:

您可以为编码属性创建单独的字段/getter。这样,原始值将保持不变。您还可以依靠反射来获取所有字段并执行此操作,这将比这更混乱。

class User {
    private String firstName;
    private String lastName;
    private String encodedName;

    public String getEncodedName(){
        return URLEncoder.encode(this.firstName, "UTF-8”)+URLEncoder.encode(this.lastName, "UTF-8");
    }
}

【讨论】:

  • 我也分别对每个属性进行编码。但我不太喜欢这种方法。在你的情况下,我需要改变我的模型并违反责任原则。我想知道是否有人知道特定处理响应的更优雅和简单的方法。我的层次结构真的很大。
猜你喜欢
  • 2019-03-31
  • 2016-11-20
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2013-08-02
  • 1970-01-01
相关资源
最近更新 更多