说实话评论区大家讨论挺热烈的,主要是围绕这段代码的质量如何?就我个人而言,如果站在职业修养的角度来说,那么,贴出这段代码的程序员可能存在泄漏源代码的风险。
我虽然写了很多年代码,这段代码确实存在一些问题,有很多优化的点,说实话,自从AI出来以后,我感觉AI在写代码方面真的挺强的,特别是现在的AI搜索更是将以前的搜索体验拉升了一个高度,我个人觉得AI将是我们这个时代最大的机会!
既然如此,我将这段代码喂给了AI,让他给出公正的评价,更能让大家信服。
具体提示词如下:
你现在是一名具有10年经验的Java程序员,我将发给你一段Java后端代码,站在你的角度来客观评价这段代码,并给出你的优化建议。
好了,我们来看看AI给出的回答,如下图:
并且它还给了我优化后的代码:
public class PostRequestService {
private static final String FAIL_ID_NUM_KEY = "failIdNum";
private static final String MESSAGE_KEY = "message";
public com.alibaba.fastjson2.JSONObject sendPostRequest(String url, RequestParams params) {
params.put("appId", params.getAppId());
params.put("clientId", params.getClientId());
params.put("clientSecret", params.getClientSecret());
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<com.alibaba.fastjson2.JSONObject> requestEntity = new HttpEntity<>(params.toJson(), headers);
com.alibaba.fastjson2.JSONObject response = null;
try {
response = restTemplate.postForObject(url, requestEntity, com.alibaba.fastjson2.JSONObject.class);
String idNum = response != null ? response.getString("idNum") : null;
if ("0000".equals(response.getString("code"))) {
log.info("请求成功");
return response;
} else {
handleFailure(idNum, response.getString(MESSAGE_KEY));
}
} catch (Exception e) {
handleException(e);
}
return response;
}
private void handleFailure(String idNum, String message) {
List<String> failIdNums = getFailIdNums();
if (idNum != null) {
failIdNums.add(idNum);
}
redisCache.deleteObject(FAIL_ID_NUM_KEY);
redisCache.setCacheList(FAIL_ID_NUM_KEY, failIdNums);
log.warn("请求失败: " + message);
}
private void handleException(Exception e) {
String message = e.getMessage();
if (message != null && !message.isEmpty()) {
message = message.split("\n")[0];
}
List<String> failIdNums = getFailIdNums();
failIdNums.add(message);
redisCache.deleteObject(FAIL_ID_NUM_KEY);
redisCache.setCacheList(FAIL_ID_NUM_KEY, failIdNums);
log.error("请求异常: " + message, e);
}
private List<String> getFailIdNums() {
return redisCache.hasKey(FAIL_ID_NUM_KEY)
? redisCache.getCacheList(FAIL_ID_NUM_KEY)
: new ArrayList<>();
}
}
class RequestParams {
private String appId;
private String clientId;
private String clientSecret;
private Map<String, Object> data;
// Getter and setter methods
public com.alibaba.fastjson2.JSONObject toJson() {
com.alibaba.fastjson2.JSONObject json = new com.alibaba.fastjson2.JSONObject();
json.put("appId", this.appId);
json.put("clientId", this.clientId);
json.put("clientSecret", this.clientSecret);
json.put("data", this.data);
return json;
}
}
对于这段代码到这里就完了吗?如果是有经验的程序员,肯定会知道fastjson之前出现过漏洞,我相信AI肯定也知道,但是你不问它,它是不会告诉你的,因为它不是神,它只是机器人😂
我们先来测试一下,我用搜索引擎去搜一下fastjson之前出现过的漏洞有哪些,然后再来问它,进行对比一下。
搜索语法:fastjson site:cve.org
接下来,我将问题抛给AI,看看它给出的答案如何?
与搜索引擎的结果对吧,你会发现有缺失,它有漏掉,并且给出的英文回复,其实出现这个问题是给出的提示词不够精准,我接下来与它对话的时候,将指出它的错误,并让它修复答案,这次的表现就很完美了,见下图
由于我这里没有对应的pom文件,并不清楚这个代码是否存在漏洞,但我们只能给出一个粗略的提问,我以为它只能给我一个大而范的解决方案,没想到它的回答惊艳我了,如下图
兄弟们,你们以为到这里就结束了吗?没有,它竟然给出了我优化后的代码,而且还做了针对性的防护,源码如下:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.ParserConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.web.client.RestTemplate;
public class PostRequestService {
private static final String FAIL_ID_NUM_KEY = "failIdNum";
private static final String MESSAGE_KEY = "message";
static {
// 启用SafeMode
ParserConfig.getGlobalInstance().setSafeMode(true);
// 关闭AutoType
ParserConfig.getGlobalInstance().setAutoTypeSupport(false);
}
public JSONObject sendPostRequest(String url, RequestParams params) {
params.put("appId", params.getAppId());
params.put("clientId", params.getClientId());
params.put("clientSecret", params.getClientSecret());
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<JSONObject> requestEntity = new HttpEntity<>(params.toJson(), headers);
JSONObject response = null;
try {
response = restTemplate.postForObject(url, requestEntity, JSONObject.class);
String idNum = response != null ? response.getString("idNum") : null;
if ("0000".equals(response.getString("code"))) {
log.info("请求成功");
return response;
} else {
handleFailure(idNum, response.getString(MESSAGE_KEY));
}
} catch (Exception e) {
handleException(e);
}
return response;
}
private void handleFailure(String idNum, String message) {
List<String> failIdNums = getFailIdNums();
if (idNum != null) {
failIdNums.add(idNum);
}
redisCache.deleteObject(FAIL_ID_NUM_KEY);
redisCache.setCacheList(FAIL_ID_NUM_KEY, failIdNums);
log.warn("请求失败: " + message);
}
private void handleException(Exception e) {
String message = e.getMessage();
if (message != null && !message.isEmpty()) {
message = message.split("\n")[0];
}
List<String> failIdNums = getFailIdNums();
failIdNums.add(message);
redisCache.deleteObject(FAIL_ID_NUM_KEY);
redisCache.setCacheList(FAIL_ID_NUM_KEY, failIdNums);
log.error("请求异常: " + message, e);
}
private List<String> getFailIdNums() {
return redisCache.hasKey(FAIL_ID_NUM_KEY)
? redisCache.getCacheList(FAIL_ID_NUM_KEY)
: new ArrayList<>();
}
}
class RequestParams {
private String appId;
private String clientId;
private String clientSecret;
private Map<String, Object> data;
// Getter and setter methods
public JSONObject toJson() {
JSONObject json = new JSONObject();
json.put("appId", this.appId);
json.put("clientId", this.clientId);
json.put("clientSecret", this.clientSecret);
json.put("data", this.data);
return json;
}
}
我只能说,AI真牛叉,说它垃圾的兄弟们,要反思一下,是不是你的提问方式不对,还是你的知识深度不够! 但是,之前某位大佬说的“未来将不再存在程序员这一职业”,我是不赞同的,并不是我是一名程序员,我认同的观点是:“编程的难度会越来越低,只是低端程序员会逐渐被淘汰”。 说实话,你想吗?如果你只是会CRUD,加上现在这种红海市场,程序员饱和度这么高,再加上大龄,你哪里有什么出路吗?因此,我建议大部分程序员先在某一个领域做深,再拓展自己的广度,而不是真正的只安心做一个码农! 各位同学,言尽于此,要想摆脱程序员35岁的魔咒,唯有花时间花金钱提升自己的实力! 最后,想学编程的同学,可以关注一下这个网站,上面的内容很全哦😂
网站地址:https://www.j301.cn
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。