gpt4 book ai didi

php - GoLang Web 服务器在 Json 响应中发送参数结构的描述

转载 作者:数据小太阳 更新时间:2023-10-29 03:12:22 26 4
gpt4 key购买 nike

事情是这样的:我已经在大型系统 (PHP) 上工作了几年,现在,我决定放弃部分繁重的工作,转而使用 golang 脚本。

到目前为止,我将一些 php 脚本复制到了一个 go 版本中。然后,我能够对哪个选项更好进行基准测试(好的,我知道 go 更快,但我需要 curl 或 sockets 进行通信,所以,我必须检查它是否仍然值得)。

其中一个脚本只是生成一个随机代码,检查这个新代码是否已经被使用(在mysql db上),如果没有,记录新代码并返回它,如果已经被使用,就递归调用函数再次直到找到独占代码。非常简单。

我已经在 php 中有了这个代码生成器,所以,在 go 中写了一个新的,被称为带有 json 参数的 http/post。使用 linux 终端,我称之为

curl -H [headers] -d [jsondata] [host]

然后我得到一个非常简单的 json

{"locator" : "XXXXXX"}

之后,我编写了一个简单的 php 脚本来调用脚本并检查每个脚本完成需要多长时间,例如:

<?php
public function indexAction()
{
$phpTime = $endPHP = $startPHP =
$goTime = $endGO = $startGO = 0;

// my standard function already in use


ob_start();

$startPHP = microtime(true);
$MyCodeLocator = $this->container->get('MyCodeLocator')->Generate(22, 5);
$endPHP = microtime(true);

ob_end_clean();


sleep(1);
// Lets call using curl
$data = array("comon" => "22", "lenght" => "5");
$data_string = json_encode($data);

ob_start();
$startGO = microtime(true);



$ch = curl_init('http://localhost:8888/dev/fibootkt/MyCodeGenerator');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($data_string))
);

$result = curl_exec($ch);
curl_close($ch);
$endGO = microtime(true);
ob_end_clean();

$result_rr = json_decode($result);

// tst just echo the variable in a nice way, second parameter means no kill execution
tst($result, 1); // HERE IS MY PROBLEM, please read below
tst($result_rr, 1); // IT SHOW NULL

sleep(1);

// just to have params for comparision, always try by shell script
ob_start();
$startShell = microtime(true);;

$exec = "curl -H \"Content-Type: application/json\" -d '{\"comon\":\"22\"}' http://localhost:8888/dev/fibootkt/MyCodeGenerator";
$output = shell_exec($exec);
$endShell = microtime(true);
ob_end_clean();

tst(json_decode($output),1); // here show a stdclass with correct value
tst($output,1); // here shows a json typed string ready to be converted

// and here it is just for show the execution time ...
$phpTime = $endPHP - $startPHP;
$goTime = $endGO - $startGO ;
$shellTime = $endShell - $startShell;

tst("php " . $phpTime, 1);
tst("curl ". $goTime, 1);
tst("shell " . $shellTime, 1);

然后我从 GO 得到结果:通过 Shell 脚本:

{"locator" : "DPEWX22"} 

因此,这个非常容易解码为 stdobj。

但是,使用 curl,操作更快!所以,我想使用它。但是,curl 请求响应如下:

{"Value":"string","Type":{},"Offset":26,"Struct":"CodeLocatorParams","Field":"lenght"}
{"locator":"DPEWX22"}

当我尝试对其进行解码时,结果为空!!!

CodeLocatorParams 是我在 go 中用来获取 post 参数的结构类型,如下所示

所以,这是我的问题:为什么 GO 返回这个?如何避免。

我有另一个类似的 go 脚本,它不带参数并响应类似的 json(但在这种情况下,是一个二维码图像路径)并且它工作正常!

我的 go 函数:

type CodeLocatorParams struct {
Comon string `json:"comon"`
Lenght int `json:"lenght"`
}

func Generate(w http.ResponseWriter, r *http.Request) {


data, err := ioutil.ReadAll(io.LimitReader(r.Body, 1048576))
if err != nil {
fmt.Println(err)
panic(err)

}
if err := r.Body.Close(); err != nil {
panic(err)
}

// retrieve post data and set it to params which is CodeLocatorParams type
var params CodeLocatorParams
if err := json.Unmarshal(data, &params ); err != nil {
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
w.WriteHeader(422) // unprocessable entity
if err := json.NewEncoder(w).Encode(err); err != nil {
fmt.Println(err)
panic(err)
}
}





var result struct{
Locator string `json:"locator"`
}
// here actually comes the func that generates random code and return it as string, but for now, just set it static
result.Locator = "DPEWX22"

w.Header().Set("Content-Type", "application/json; charset=UTF-8")
json.NewEncoder(w).Encode(result)


}

最佳答案

解析传入的 JSON 时出错。此错误以 {"Value":"string","Type":{},"Offset":26,"Struct":"CodeLocatorParams","Field":"lenght"} 形式写入响应。处理程序继续执行并写入正常响应 {"locator":"DPEWX22"}

修复方法如下:

  • 写入错误响应后,从处理程序返回。
  • 输入 JSON 的长度为字符串值。要么将结构字段从 int 更改为字符串,要么修改输入以传递整数。

关于php - GoLang Web 服务器在 Json 响应中发送参数结构的描述,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48028207/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com