在实际的程序编写中,特别是微服务间的调用时,经常会出现一个请求的,其入参的key值定义非常的不规范,导致服务端想要接受参数时,请求体内部的属性也定义的乱七八糟。
举个例子:如果一个post请求是以这种参数格式发送过来的:

{
	"json_name":"json_test",
	"json_value":"test123",
	"json_id":"1"
}

那么在不对key进行处理的情况下,可能需要定义一个对象用来接收请求参数,具体的对象定义可能会是这样:

import lombok.Data;

@Data
public class TestJson {

    private String json_name;
    private String json_value;
    private String json_id;
}

这里使用lombok的插件,不清楚的可以去网上另找几篇blog看看,实际运行结果,可以看到定义的controller也确实收到了请求,并将请求的json字符串转成TestJson对象,这里可以转化的原因在于,定义的对象属性与json中的key保持了一致,如果不一致将会导致对象中的属性为null(即系统的默认初始值)
请求参数
这里程序是可以正常运行的,但是对象TestJson的属性命名方式总会给人感觉不是很好,所以这里我们可以使用另一种方式,即使用JsonProperty注解来将json中的key做一个映射,修改后的TestJson对象如下:

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Getter;
import lombok.ToString;

@ToString
public class TestJson {

    @Getter
    private String jsonName;
    
    @Getter
    private String jsonValue;
    
    @Getter
    private String jsonId;

    @JsonProperty(value = "json_name")
    public void setJsonName(String jsonName) {
        this.jsonName = jsonName;
    }

    @JsonProperty(value = "json_value")
    public void setJsonValue(String jsonValue) {
        this.jsonValue = jsonValue;
    }

    @JsonProperty(value = "json_id")
    public void setJsonId(String jsonId) {
        this.jsonId = jsonId;
    }
}

从代码上可以看出来在属性值设置的时候,对于属性和jsonkey值之间做了一层映射关系,现在试一下能否成功的接收到全部请求参数:
修改后的请求结果
可以看到,同样的请求参数,一样可以controller层完全获取请求参数信息,但是代码确好看整洁了。现在关于入参基本上说的差不多了,现在还有就是服务端返回给客户端时,如果客户端要求的参数名称命名不规范该怎么处理呢,还是使用@JsonProperty注解来帮助完成映射关系。
比如如下代码就是将jsonId转换换为device_id,然后传回客户端,修改后的TestJson对象如下所示:

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Getter;
import lombok.ToString;

@ToString
public class TestJson {

    @Getter
    private String jsonName;

    @Getter
    private String jsonValue;

    private String jsonId;

    @JsonProperty(value = "json_name")
    public void setJsonName(String jsonName) {
        this.jsonName = jsonName;
    }

    @JsonProperty(value = "json_value")
    public void setJsonValue(String jsonValue) {
        this.jsonValue = jsonValue;
    }

    @JsonProperty(value = "json_id")
    public void setJsonId(String jsonId) {
        this.jsonId = jsonId;
    }

    @JsonProperty("device_id")
    public String getJsonId() {
        return jsonId;
    }
}

下面看一下请求返回的结果:
修改后的请求返回结果

可以看到,挡在get方法上使用JsonProperty注解时,程序将TestJson转换成json对象对外输出时,将jsonId属性值转换成了json中key为device_id的值。通过合理的使用JsonProperty注解可以在很大程度上保持代码在命名上的规范。

注:这里使用JsonProperty注解,是因为使用的spring的框架,在spring框架中默认使用的json类是jackson,如果在实际使用过程中所使用的json相关类并不是jackson,那么JsonProperty可能并不能达到使用要求,需要根据具体使用json来使用注解。 比如使用的是阿里的fastjson,那么可能需要考虑使用JSONField这个注解了。

关于如何对http/https请求中如何优雅的对请求参数和输出参数的key进行处理就说到这,有兴趣的朋友可以以关注我,遇到问题大家一起讨论一下!!
这是我的微信公众号,如果可以的话,希望您可以帮忙关注一下,这将是对我最大的鼓励了,谢谢!!

公众号

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐