http/https请求中如何优雅的对请求参数和输出参数的key进行处理
在实际的程序编写中,特别是微服务间的调用时,经常会出现一个请求的,其入参的key值定义非常的不规范,导致服务端想要接受参数时,请求体内部的属性也定义的乱七八糟。举个例子:如果一个post请求是以这种参数格式发送过来的:{"json_name":"json_test","json_value":"test123",&qu
在实际的程序编写中,特别是微服务间的调用时,经常会出现一个请求的,其入参的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进行处理就说到这,有兴趣的朋友可以以关注我,遇到问题大家一起讨论一下!!
这是我的微信公众号,如果可以的话,希望您可以帮忙关注一下,这将是对我最大的鼓励了,谢谢!!
更多推荐
所有评论(0)