0%

简单留言上链记录[GPT写代码版]

有问题:

当出现了ChatGPT,我发现我的编程能力直接退化,遇到问题,问他,错了继续问,总有一次会问对的。

某个场景,我需要将中文转换为16进制的字符串。(其实就是在evm中留言功能,但是evm只认16进制)

这个功能本来很简单的,直到我发现中文转换出现了异常。(你就不会只用英文写)

原代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class StringToHex {
public static void main(String[] args) {
String originalString = "你好"; // 替换为你想要转换的字符串
String hexString = convertStringToHex(originalString);
System.out.println("原始字符串: " + originalString);
System.out.println("转换为16进制字符串: " + hexString);
}

public static String convertStringToHex(String str) {
StringBuilder hexString = new StringBuilder();
for (char character : str.toCharArray()) {
String hex = Integer.toHexString(character);
hexString.append(hex);
}
return hexString.toString();
}
}

GPT答案:

问了N次后GPT给出的新代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.nio.charset.StandardCharsets;
public class StringToHex {
public static void main(String[] args) {
String originalString = "你"; // 替换为你想要转换的字符串
String hexString = convertStringToHex(originalString);
System.out.println("原始字符串: " + originalString);
System.out.println("转换为16进制字符串: " + hexString);
}

public static String convertStringToHex(String str) {
StringBuilder hexString = new StringBuilder();

for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
String hex = Integer.toHexString(ch);
hexString.append(hex);
}

return hexString.toString().toUpperCase();
}
}

我尝试将中文和英文数字和标点符号混合,比如

你好abc123,!

但是这种测试居然不通过,我就不能理解了。

image-20240104204743031

再试试看纯中文的。

你好

我就非常不能理解,连网上的转换工具也是给出一样的转换结果。

image-20240104205024669

结果浏览器就是不显示。

image-20240104205059113

这…….

工具不一致:

卧槽,好像其他的工具转换的结果不一样,纳尼……

image-20240104205229738

我TM的…..

继续问GPT去,总会有结果的。

GPT答案2:

GPT又给出新+代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.nio.charset.StandardCharsets;

public class StringToHex {
public static void main(String[] args) {
String originalString = "你好"; // 替换为你想要转换的字符串
String hexString = convertStringToHex(originalString);
System.out.println("原始字符串: " + originalString);
System.out.println("转换为16进制字符串: " + hexString);
}

public static String convertStringToHex(String str) {
byte[] bytes = str.getBytes(StandardCharsets.UTF_8);

StringBuilder hexString = new StringBuilder();
for (byte aByte : bytes) {
String hex = Integer.toHexString(aByte & 0xff);
if (hex.length() == 1) {
hexString.append('0');
}
hexString.append(hex);
}
return hexString.toString();
}
}

这个给出的答案和上面的网站是一样的。

我们发送一笔交易,去浏览器看看结果。

image-20240104205956210

这就正常了。

反正又就继续问GPT,总会问对的。(这样还要你干嘛)

我继续测试上面的那个复杂组合,如果没有问题就证明这个方法写对了。

image-20240104210553986

ok,感谢GPT。

写后端:

我这边写一个留言简单的demo,他只有留言的内容,你可以在内容里面写上留言的人是谁。

然后这个留言信息会被发送到区块链,因为主网需要手续费,所以我选择了测试网来实验程序。

测试网:opbnb testnet

后端接口:springboot+云函数

至于怎么样部署云函数可以查看我之前的文章,这里就不重复介绍了。

这里我遇到了一个GPT都无法解决的BUG,我重新构建了数次项目都无济于事。我一度怀疑是IDE的环境问题,然后我更换了编辑器仍然不解决问题。包括但不限于重新创建SpringBoot项目,重新创建maven项目然后改造为springboot项目,但是这些都不能解决问题。

报错代码如下所示:

1
2
3
4
2024-01-06 01:38:10.547 ERROR 5172 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.NoSuchMethodError: okhttp3.RequestBody.create(Ljava/lang/String;Lokhttp3/MediaType;)Lokhttp3/RequestBody;] with root cause

java.lang.NoSuchMethodError: okhttp3.RequestBody.create(Ljava/lang/String;Lokhttp3/MediaType;)Lokhttp3/RequestBody;
at org.web3j.protocol.http.HttpService.performIO(HttpService.java:159) ~[core-4.8.7.jar:na]

我无奈的把错误信息在谷歌搜索,他只有一条结果,指向了github webj的讨论区。

https://github.com/web3j/web3j/issues/1271

我找到了一个方案,我尝试修复他。

image-20240106014955476

他的意思大概是说人们运行springboot的时候,okhttp3依赖会莫名其妙的消失,他建议他们手动添加该依赖。

这是什么鬼理论,依赖包不见了不去修复,让用户手动添加……

1
2
3
4
5
6
<!--  Needed to avoid conflict with OkHttp being used in auth0-java and okhttp3 being used by spring -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.0</version>
</dependency>

但是这个做法是没有问题的,既然找不到,那就手动加一个,我就是要他上面的版本依赖(这样不容易出问题)。

当我在本地测试成功的时候,鬼知道我多么高兴,可以去睡觉了。

image-20240106015257826

发送成功了,给出了哈希值。

验证地址:

https://opbnb-testnet.bscscan.com/tx/0xda1f2041a504ab0fa564b8385bb7bdabf983ceb3d7f30521a7d0e74253fd60b0

image-20240106015509860

睡觉,睡觉。

写前端:

让GPT接着写前端,遇到一个小问题。

最方便的做法就是直接复制错误信息提问,其实就是同源策略出了问题,也好解决。

如果你还不知道什么叫做同源策略,请百度后再来查看本文。

这是最初完成的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Submit Text</title>
<!-- 引入Vue和axios -->
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<style>
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background-color: #f0f0f0;
}
.container {
width: 80%;
max-width: 500px;
text-align: center;
padding: 20px;
background-color: #fff;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
input[type="text"],
button,
textarea {
width: 100%;
margin-bottom: 10px;
padding: 8px;
border-radius: 4px;
border: 1px solid #ccc;
box-sizing: border-box;
}
button {
background-color: #007bff;
color: #fff;
cursor: pointer;
}
</style>
</head>
<body>
<div id="app" class="container">
<input type="text" v-model="inputText" placeholder="Enter text">
<button @click="submitText">Submit</button>
<textarea v-model="response" rows="5" placeholder="Response" readonly></textarea>
</div>

<script>
new Vue({
el: '#app',
data: {
inputText: '',
response: ''
},
methods: {
async submitText() {
if (!this.inputText.trim()) {
this.response = '请输入文本';
return;
}

try {
const response = await axios.get(`http://localhost:8080/text?text=${this.inputText}`, {
timeout: 30000 // 设置超时时间为30秒(以毫秒为单位)
});
this.response = response.data;
} catch (error) {
console.error(error);
this.response = 'Error occurred while fetching data.';
}
}
}
});
</script>
</body>
</html>

其实还是不错的,至少我也起来也就这个样子了。

前端部署专业的都写不好,只要功能实现了就不要纠结太多的东西。

image-20240106233742732

怎么说呢,简洁,但是功能实现了。

我再加上两行说明,变成这样。

image-20240106235821811

感觉不错的样子。

发布上线:

前端我直接在博客里面上线好了,这样简单,反正就是一个页面的事情。

后端用云函数部署,成本应该也不高。

本地打包后30MB(如果打包失败请检查pom.xml中有无build内容)

image-20240107000731293

jar包可以正常运行。

云函数部署在杭州,测试调用正常。(首次需要启动项目会比较慢)

image-20240107001847307

这个就是用云函数测试的结果,调用正常。

如果没有使用,函数会休眠,基本上不收取费用,弹性收费,还是不错的。

最后的前端上线地址应该是:

https://120.show/text.html

你可以去测试玩耍(没有奖励)。

完结,撒花!