RESTful接口

请求URL:

  • https://api.xxx.com/Tbsapi/v1/ip2addr?ip=219.140.227.235

请求方式:

  • GET

参数:

参数名 类型 说明
ip url-qurey-string 可选 要查询的ip地址,如果不传这表示当前的ip

返回示例

{"code": 1,"data": {"Country": "中国","Province": "湖北省","City": "武汉","ISP": "","Latitude": 30.5801,"Longitude": 114.2734,"TimeZone": "Asia/Shanghai"},"ip": "219.140.227.235"
}

json_rpc tcp 地址: 121.40.238.123(IP地址更快) api.turboes.com 端口: 3344


第三方资源

  • GeoIP2 Reader for Go
  • GeoLite2 开源数据库

go标准库jsonRPC服务端

Go官方提供了一个RPC库: net/rpc。包rpc提供了通过网络访问一个对象的方法的能力。服务器需要注册对象, 通过对象的类型名暴露这个服务。注册后这个对象的输出方法就可以远程调用,这个库封装了底层传输的细节,包括序列化。服务器可以注册多个不同类型的对象,但是注册相同类型的多个对象的时候回出错。

  • 方法的类型是可输出的 (the method's type is exported)
  • 方法本身也是可输出的 (the method is exported)
  • 方法必须由两个参数,必须是输出类型或者是内建类型 (the method has two arguments, both exported or builtin types)
  • 方法的第二个参数是指针类型 (the method's second argument is a pointer)
  • 方法返回类型为 error (the method has return type error)
package mainimport ("fmt""github.com/oschwald/geoip2-golang""net""net/rpc""net/rpc/jsonrpc""os""log"
)
//返回值结构体
//需要满足以上要求
type Response struct {Country   stringProvince  stringCity      stringISP       stringLatitude  float64Longitude float64TimeZone  string
}type Ip2addr struct {db *geoip2.Reader
}
//参数结构体
//需要满足以上要求
type Agrs struct {IpString string
}
//json rpc 处理请求
//需要满足以上要求
func (t *Ip2addr) Address(agr *Agrs, res *Response) error {netIp := net.ParseIP(agr.IpString)record, err := t.db.City(netIp)res.City = record.City.Names["zh-CN"]res.Province = record.Subdivisions[0].Names["zh-CN"]res.Country = record.Country.Names["zh-CN"]res.Latitude = record.Location.Latituderes.Longitude = record.Location.Longituderes.TimeZone = record.Location.TimeZonereturn err
}func main() {//加载geoIp数据库db, err := geoip2.Open("./GeoLite2-City.mmdb")if err != nil {log.Fatal(err)}//初始化jsonRPCip2addr := &Ip2addr{db}//注册rpc.Register(ip2addr)//绑定端口address := ":3344"tcpAddr, err := net.ResolveTCPAddr("tcp", address)checkError(err)listener, err := net.ListenTCP("tcp", tcpAddr)checkError(err)log.Println("json rpc is listening",tcpAddr)for {conn, err := listener.Accept()if err != nil {continue}jsonrpc.ServeConn(conn)}}func checkError(err error) {if err != nil {fmt.Println("Fatal error ", err.Error())os.Exit(1)}
}

PHP-jsonRPC客户端

class JsonRPC
{public $conn;function __construct($host, $port){$this->conn = fsockopen($host, $port, $errno, $errstr, 3);if (!$this->conn) {return false;}}public function Call($method, $params){$obj = new stdClass();$obj->code = 0;if (!$this->conn) {$obj->info = "jsonRPC连接失败!请联系qzhou@turboes.com";return $obj;}$err = fwrite($this->conn, json_encode(array('method' => $method,'params' => array($params),'id' => 0,)) . "\n");if ($err === false) {fclose($this->conn);$obj->info = "jsonRPC发送参数失败!请检查自己的rpc-client代码";return $obj;}stream_set_timeout($this->conn, 0, 3000);$line = fgets($this->conn);fclose($this->conn);if ($line === false) {$obj->info = "jsonRPC返回消息为空!请检查自己的rpc-client代码";return $obj;}$temp = json_decode($line);$obj->code = $temp->error == null ? 1 : 0;$obj->data = $temp->result;return $obj;}
}function json_rpc_ip_address($ipString)
{$client = new JsonRPC("127.0.0.1", 3344);$obj = $client->Call("Ip2addr.Address", ['IpString' => $ipString]);return $obj;
}

go语言jsonRPC客户端

package mainimport ("fmt""log""net/rpc/jsonrpc"
)type Response struct {Country   stringProvince  stringCity      stringISP       stringLatitude  float64Longitude float64TimeZone  string
}
type Agrs struct {IpString string
}
func main() {client, err := jsonrpc.Dial("tcp", "121.40.238.123:3344")if err != nil {log.Fatal("dialing:", err)}// Synchronous callvar res Responseerr = client.Call("Ip2addr.Address", Agrs{"219.140.227.235"}, &res)if err != nil {log.Fatal("ip2addr error:", err)}fmt.Println(res)}

欢迎pr/star golang-captcha

golang解析IP到城市jsonRPC服务教程相关推荐

  1. geoip mysql_使用geoIP数据库解析IP到城市jsonRPC服务教程

    ### RESTful接口 **请求URL:** - ` https://api.turboes.com/Tbsapi/v1/ip2addr?ip=219.140.227.235` **请求方式:** ...

  2. Golang 微服务教程

    本节对 gRPC 的使用浅尝辄止,更多可参考:gRPC 中 Client 与 Server 数据交互的 4 种模式 前言 系列概览 <Golang 微服务教程>分为 10 篇,总结微服务开 ...

  3. Golang微服务教程

    转自:https://segmentfault.com/a/1190000015135650?utm_campaign=studygolang.com&utm_medium=studygola ...

  4. 解析ip到对应城市:ipdatabase

    一.实现目的 在解析网络访问日志的时候,ip是不可避免地分析KPI.而有时候需要把访问ip直接转换为对应城市,这样如果自己编写程序,就会浪费很多时间,在此介绍一个有效地开源github项目,可以实现i ...

  5. Logstash数据处理服务的过滤插件GeoIP解析IP地址的地理位置

    Logstash数据处理服务的过滤插件GeoIP解析IP地址的地理位置 文章目录 Logstash数据处理服务的过滤插件GeoIP解析IP地址的地理位置 1.GeoIP解析IP地址的地理位置 2.安装 ...

  6. python 通过ip获取城市_python中通过客户端IP拿到所在城市和当地天气信息—附带项目案例...

    首先,需求分析: 1.拿到客户端IP 2.通过IP拿到客户端所在地区 3.通过地区拿到当地天气 4.整合功能,展示给用户 第一步,如何拿到用户IP 我们以Django环境为例 # 客户端的请求,IP信 ...

  7. 微服务教程--什么是 Nacos

    微服务教程--什么是 Nacos 概览 欢迎来到 Nacos 的世界! Nacos 致力于帮助您发现.配置和管理微服务.Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现.服务配置.服 ...

  8. 折腾Transmission实现固定IP服务器BT做种教程

    title: 折腾Transmission实现固定IP服务器BT做种完美 通过网络分享资源,是为了让人下载,但由于种种原因,放到商业网盘的资源经常会被删除,于是我只好自建简易的http文件下载服务,比 ...

  9. 获取外网IP,再根据IP定位城市

    根据ip定位城市对外开放的接口,有些接口不能直接用了,比如说淘宝接口.这里我用的是一个不知名的接口. 1.AddressUtil工具类 package cn.ztjz.module.audit.uti ...

最新文章

  1. VMware14安装CentOS7的详细教程
  2. ASP.NET MVC请求处理管道生命周期的19个关键环节(1-6)
  3. Bad version number in .class file
  4. 企业联合体的形式_联合体如何联合?——总包新政下,联合体如何联合?系列三...
  5. java国家电网面试试题_国家电网笔试面试相关
  6. java找_Java基础之:查找
  7. 第一次当项目经理压力大_项目经理不想被甩锅,你要这样做进度管理
  8. c语言写的心理测试,写了个心理测试的c程序(*^__^*) 嘻嘻……
  9. 一个逐页抓取网站小说的爬虫
  10. http 标准超时时间_Go 中 http 超时问题的排查
  11. LeetCode 623. Add One Row to Tree
  12. POJ 3668 枚举?
  13. 截止11月5日,30日内累计跌幅最大的200只股票
  14. Thinkpad SL400开启蓝牙
  15. PMP项目管理是什么意思?
  16. 编写程序,求出几何形状(长方形、正方形、圆形)的周长和面积
  17. Jetson tx2 使用 jetpack 4.3刷机全过程
  18. 高级端点保护 (AEP) 简介
  19. 【pymysql模块】
  20. 亚马逊、eBay、敦煌、wish、Lazada、阿里国际卖家有一套自养号测评技术多重要

热门文章

  1. 在WORD中删除中文或英文
  2. 【补充一则】身份证校验的c#代码
  3. SecureCRT安装
  4. 防数据泄密:是否应实施“多重认证”?
  5. 一些服务器客户端的c例子
  6. JQuery URL的GET参数值获取方法
  7. Elasticsearch性能监控(一)
  8. React 第九章 表单的使用
  9. lnmp环境配置laravel项目白屏问题
  10. laravel的安装