草庐IT

postgresql - 通用 REST API Golang

coder 2024-07-13 原文

在 SO 中搜索 Generic REST API Golang 得到 0 个结果。搜索谷歌给出 2 个结果。所以这个问题可能没有正确表述或者不可能在 Golang 中实现。

我的目标是避免一遍又一遍地重复类似的代码。所以我试图让 Golang 中的代码尽可能通用。一次编写,多次使用。

这是我第一次尝试在 Golang 中为 select 创建一个通用的 REST API。下面的代码几乎给出了我想要的:

但结果显示在终端中。我不知道如何将结果重定向到浏览器。

package main

import (
    "fmt"
    "log"
    "net/http"
    "database/sql"
    "time"
    _ "github.com/lib/pq"
)

var db *sql.DB

func main() {
   Connect()
   http.HandleFunc("/", Query)
   log.Fatal(http.ListenAndServe(":8080", nil))
}

func Connect() {
   const (
   host = "127.0.0.1"
   port = 5432
   user = "test"
   password = "test"
   dbname  = "Test")

login := fmt.Sprintf("host=%s port=%d user=%s "+"password=%s dbname=%s sslmode=require", host, port, user, password, dbname)
var err error
  db, err = sql.Open("postgres", login)
if err != nil {
    log.Fatalln(err)
}
err = db.Ping()
  if err != nil {
  panic(err)
}

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

   var query string
   switch r.URL.String() {
   case "/getuser":
      query = "select * from getuser()"
   case "/getco":
      query = "select * from getco()"
   case "/etc"
      query = "select * from etc"
   default:
      query = ""
   }

  var err error
  var rows *sql.Rows

  rows, err = db.Query(query)
  if err != nil {
      http.Error(w, http.StatusText(500), 500)
      return
   }
  defer rows.Close()

  cols, err := rows.Columns()
  vals := make([]interface{}, len(cols))
  for i := 0; i < len(cols); i++ {
      vals[i] = new(interface{})
      if i != 0 {
        fmt.Print("\t")
      }
      fmt.Print(cols[i])
   }
fmt.Println()

for rows.Next() {
    err = rows.Scan(vals...)
    if err != nil {
        fmt.Println(err)
        continue
    }
    for i := 0; i < len(vals); i++ {
        if i != 0 {
            fmt.Print("\t")
        }
        printValue(vals[i].(*interface{}))
    }
    fmt.Println()
}


func printValue(pval *interface{}) {
    switch v := (*pval).(type) {
    case nil:
        fmt.Print("NULL")
    case bool:
        if v {
           fmt.Print("1")
        } else {
           fmt.Print("0")
        }
    case []byte:
        fmt.Print(string(v))
    case time.Time:
        fmt.Print(v.Format("2006-01-02"))
    default:
        fmt.Print(v)
    }
 }

每次尝试写入浏览器都会出现各种类型的错误:

fmt.Printf("%s\n", vals...)

我的问题是

  1. 如何将结果重定向到浏览器?
  2. 有没有更好的方法来实现这一点? (重用通用代码)

最佳答案

我的建议是查看使用现有包(如“mux”)在浏览器中调用 REST API。作为一个快速演示,您将如何按如下方式进行操作:

您的 restapi.go 可能具有如下 API:

func SampleAPI(w http.ResponseWriter, r *http.Request) { //Assuming this is a POST request
    var example SomeSruct 
    _ = json.NewDecoder(r.Body).Decode(&example) //Decode the POST body
    result := someLogicFunction(example) //call your generic function
    json.NewEncoder(w).Encode(result) //encode the result to pass it back to browser
}

现在假设你写了一个 main.go 并且你正在使用 mux 包这里是你如何调用它的例子

主.go

func main() {
    router := mux.NewRouter()
    router.HandleFunc("/testFunc",restapi.SampleAPI).Methods("POST") //This creates the route for your http request
    handler := cros.Default().Handler(router) //You will need this if you plan to deploy it in a server and call it externally for testing locally you don't need this
    log.Fatal(http.ListenAndServe(":8080", handler)) //Port that the router is listening to
}

现在请注意,您必须导入“github.com/gorilla/mux”和“github.com/rs/cors”包才能使用它们,但这样您就可以创建 REST API,您可以通过 te浏览器。同样,您可以创建一个 GET 方法并使用您可以在函数中获取的参数并执行任何逻辑步骤。

如果您构建并安装上述代码,您可以使用任何网络应用程序通过 http 发布到 localhost:8080/testFunc 并在您的浏览器中获取结果。如果您有 GET 请求,您可以直接在浏览器中输入 Url 并查看结果。

关于postgresql - 通用 REST API Golang,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49595272/

有关postgresql - 通用 REST API Golang的更多相关文章

  1. ruby-on-rails - 如何让 datamapper 与 postgresql 数据库一起工作? - 2

    我已经找到了几个使用datamapper的示例,并且能够让它们正常工作。不过,所有这些示例都是针对sqlite数据库的。我正在尝试将数据映射器与postgresql一起使用。我将datamapper中的调用从sqlite3更改为postgres,并且我已经安装了dm-postgres-adapter。但它仍然不起作用。我还需要做什么? 最佳答案 与SQLite不同,PostgreSQL不将数据库存储在单个文件中。在你拥有createdyourdatabase之后,尝试这样的事情:DataMapper.setup:default,{:

  2. sql - 在 Rails Console for PostgreSQL 的表中显示数据 - 2

    我找到了这样的东西:Rails:Howtolistdatabasetables/objectsusingtheRailsconsole?这一行没问题:ActiveRecord::Base.connection.tables并返回所有表但是ActiveRecord::Base.connection.table_structure("users")产生错误:ActiveRecord::Base.connection.table_structure("projects")我认为table_structure不是Postgres方法。如何列出Postgres数据库的Rails控制台中表中的所有

  3. ruby-on-rails - Rails 迁移中的 PostgreSQL 点类型 - 2

    我想使用PostgreSQL中的point类型。我已经完成了:railsgmodelTestpoint:point最终的迁移是:classCreateTests当我运行时:rakedb:migrate结果是:==CreateTests:migrating====================================================--create_table(:tests)rakeaborted!Anerrorhasoccurred,thisandalllatermigrationscanceled:undefinedmethod`point'for#/hom

  4. ruby-on-rails - Ruby on Rails 单表继承(STI)和单元测试问题(使用 PostgreSQL) - 2

    我正在使用带有单个“帐户”表的STI模型来保存用户和技术人员的信息(即用户...8)错误:test_the_truth(用户测试):ActiveRecord::StatementInvalid:PGError:ERROR:关系“技术人员”不存在:从“技术人员”中删除...从本质上讲,标准框架不承认Technicians和Users表(或PostgreSQL称它们为“关系”)不存在,事实上,应该别名为Accounts。有什么想法吗?我对RoR比较陌生,不知道如何解决这个问题而又不完全删除STI。 最佳答案 原来问题是由于存在:./te

  5. ruby - rails 3.2.2(或 3.2.1)+ Postgresql 9.1.3 + Ubuntu 11.10 连接错误 - 2

    我正在使用PostgreSQL9.1.3(x86_64-pc-linux-gnu上的PostgreSQL9.1.3,由gcc-4.6.real(Ubuntu/Linaro4.6.1-9ubuntu3)4.6.1,64位编译)和在ubuntu11.10上运行3.2.2或3.2.1。现在,我可以使用以下命令连接PostgreSQLsupostgres输入密码我可以看到postgres=#我将以下详细信息放在我的config/database.yml中并执行“railsdb”,它工作正常。开发:adapter:postgresqlencoding:utf8reconnect:falsedat

  6. ruby-on-rails - 如何在文本字段rails postgresql中查询json数据 - 2

    我有一个数据库表列(collection),datatypetext我在collection中插入了json数据这是我的json数据{"name":"test","age":"25","country":"xxx"}但是现在我该如何查询这个json数据。有没有如下选项User.where(collection::name)#Herenamedenotestest 最佳答案 由于JSON是一个字符串,您只能使用SQLite/MySQL(或任何其他数据库)进行字符串比较。此外,尽量将数据类型保持为二进制。您可以执行:LIKE操作以在您存

  7. ruby-on-rails - Rails Postgresql 多个模式和相同的表名 - 2

    我在两个不同的模式中有两个表,例如案例和事件。在每个模式中我都有基本表events.basiccases.basic这个表有关系:events.basic有一个cases.basic(cases.basic有多个events.basic)我的尝试失败了:文件cases_basic.rbclassCasesBasic'EventsBasic',:foreign_key=>'case_id'end文件events_basic.rbclassEventsBasic'CasesBasic',:foreign_key=>'case_id'end环境:Ruby1.9.3、Rails3.1.3、ge

  8. ruby-on-rails - 使用 PostgreSQL 适配器限制 ActiveRecord 迁移 5.0 中的文本列 - 2

    我的迁移看起来像这样classCreateQuestionings现在,当我运行$rakedb:migrate:reset时,在我的db/schema.rb中看不到限制:create_table"questionings",force::cascadedo|t|t.text"body",null:falseend我做错了吗还是这是一个错误?顺便说一下,我使用的是rails5.0.0.beta3和ruby​​2.3.0p0。 最佳答案 t.text在PostgreSQL和textdoesn'tallowforsizelimits中生成

  9. ruby - 如何在 postgresql 中创建多列推荐引擎? - 2

    我在postgresql中有一个表,其中包含一些汽车+1000000条记录:+----+--------+------+---------+-----------+-------------+------------+------------+|id|price|year|mileage|fuel_type|body_type|brand|model|+----+--------+------+---------+-----------+-------------+------------+------------+|1|4894|2011|121842|"Benzin"|"Sedan

  10. 关于如何为 PostgreSQL 编写存储过程的 Ruby 教程? - 2

    听说PostgreSQL的可以用Ruby写存储过程但我一直没能找到更多关于它的信息,教人们如何实际去做。有人可以为此推荐好的资源。谢谢 最佳答案 显然,您需要安装PL/Ruby。之后,你可以写:CREATEFUNCTIONruby_max(int4,int4)RETURNSint4AS'ifargs[0].to_i>args[1].to_ireturnargs[0]elsereturnargs[1]end'LANGUAGE'plruby';查看其GitHubrepository安装说明。

随机推荐