当前位置: 首页 > news >正文

php-golang-rpc jsonrpc和php客户端tivoka/tivoka包实践

golang 代码:

package main

import (

    "fmt"

    "net"

    "net/rpc"

    "net/rpc/jsonrpc"

)

type App struct{}

type Res struct {

    Code int    `json:"code"`

    Msg  string `json:"msg"`

    Data any    `json:"data"`

}

func (*App) Hi(mp map[string]any, res *Res) error {

    res.Code = 200

    res.Msg = "成功"

    var rmp = make(map[string]any, 0)

    if v, ok := mp["name"].(string); ok {

        rmp["name"] = "my name is " + v

    } else {

        rmp["name"] = "my name is unknown"

    }

    res.Data = rmp

    return nil

}

func main() {

    ln, err := net.Listen("tcp", ":6001")

    if err != nil {

        panic(err)

    }

    rpc.Register(new(App))

    for {

        conn, err := ln.Accept()

        if err != nil {

            continue

        }

        go func(conn net.Conn) {

            fmt.Println("new client")

            jsonrpc.ServeConn(conn)

        }(conn)

    }

}

/******************************************************/

php代码:

composer require tivoka/tivoka

<?php
namespace app\index\controller;

use app\BaseController;
use think\facade\View;

use Tivoka\Client;

class Index extends BaseController
{
    public function index()
    {
        //tcp
        $connection = Client::connect(array('host' => '127.0.0.1', 'port' => 6001));
        $connection->useSpec('1.0');
        $request = $connection->sendRequest('App.Hi', array(['name'=>'ceshi222']));
        dd($request->result);

        }

}

错误排查:

on: cannot unmarshal string into Go value of type [1]interface {}

使用jsonrpc的时候报以上两个错误,一个是因为

{
    "id": 1000,
    "method": "Arith.Divide",
    "params": "[{A:9,B:2}]"
}

一个是因为

{
    "id": 1000,
    "method": "Arith.Divide",
    "params": {
        "A": 9,
        "B": 2
    }
}

正确的应该是

 php端需要多加一层数组:

{
    "id": 1000,
    "method": "Arith.Divide",
    "params": [{
        "A": 9,
        "B": 2
    }]
}

 

http://www.lryc.cn/news/99420.html

相关文章:

  • flutter 打包iOS安装包
  • 二进制重排
  • 【Linux后端服务器开发】MAC地址与其他重要协议
  • WebGPU入门
  • React Dva项目中.roadhogrc.mock.js直接自动导入mock目录下所有文件方式
  • 跨境独立站如何应对恶意网络爬虫?
  • C# SourceGenerator 源生成器初探
  • 网络安全/信息安全—学习笔记
  • 【Visual Studio】无法打开包括文件: “dirent.h”: No such file or directory
  • asp.net MVC markdown编辑器
  • 论文浅尝 | 预训练Transformer用于跨领域知识图谱补全
  • 算法工程师-机器学习面试题总结(2)
  • 低成本32位单片机空调内风机方案
  • 读发布!设计与部署稳定的分布式系统(第2版)笔记25_互联层之路由和服务
  • AI面试官:LINQ和Lambda表达式(二)
  • Mysql原理篇--第二章 索引
  • 保姆级系列教程-玩转Fiddler抓包教程(1)-HTTP和HTTPS基础知识
  • 【iOS】单例、通知、代理
  • 从Vue2到Vue3【五】——新的组件(Fragment、Teleport、Suspense)
  • PostgreSQL——sql文件导入
  • [SQL挖掘机] - 全连接: full join
  • SpringDataJpa 实体类—主键生成策略
  • 【LeetCode 算法】Parallel Courses III 并行课程 III-拓扑
  • 进行消息撤回功能的测试时,需要考虑哪些?
  • C语言动态内存管理(三)
  • 通过cmake工程生成visual studio解决方案
  • STM32CubeMX配置STM32G031多通道ADC + DMA采集(HAL库开发)
  • Vue入门项目——WebApi
  • 【电源专题】电量计参数RSOC/RM/FCC定义
  • 实际开发中,React应用常见问题【持续更新中】