后端 golang(仅作为后端webAPI,不学习模板引擎的相关知识)
整体步骤
创建handlefunc,同时启动监听服务
连接数据库
获得请求body里面的json数据,解析json数据,并将解析出的数据作为条件查询数据。
将查询出的数据转成json格式字符串,并写入流中返回。
package main
import (
"database/sql"
"encoding/json"
"fmt"
_ "github.com/godror/godror"
"io/ioutil"
"log"
"net/http"
"strings"
)
var db *sql.DB
const (
host = "192.168.1.11"
port = 1521
user = "system"
sqlpassword = "manager"
dbname = "peixun"
)
func initsql(){
osqlInfo := fmt.Sprintf("%s/%s@%s:%d/%s", user, sqlpassword, host, port, dbname)
DB,err := sql.Open("godror",osqlInfo)
if err != nil {
panic(err)
}
err = DB.Ping()
if err != nil {
panic(err)
}
db = DB
fmt.Println("链接成功")
}
//这里一定要注意首字母大写,不然后面json转换的时候会出问题。
//由于本人水平有限,所以我也不晓得时间格式应该怎么处理。如果世界使用time类型,导出的json串里面不是yyyy-mm-dd hh:mm:ss格式。最后这里使用的是在sql里面直接传为字符串,程序里面就直接用string类型接收。
type patientInfo struct {
Patient_id string `json:"patient_id""`;
Name string `json:"name""`;
Sex string `json:"sex""`;
Birthday string `json:"birthday""`;
Id_no string `json:"id_No""`;
Charge_type string `json:"charge_type""`;
}
func selectA(patient_id string) string {
//查找
sqlStatement := "SELECT patient_id,name,sex,to_char(date_of_birth,'yyyy-mm-dd hh24:mi:ss'),id_no,charge_type FROM pat_master_index WHERE patient_id =:x1"
stmt, err := db.Prepare(sqlStatement)
defer stmt.Close()
if err != nil {
panic(err)
}
rows, err := stmt.Query(patient_id)
defer rows.Close()
if err != nil {
fmt.Println(err)
panic(err)
}
pi_list := []patientInfo{}
pi_row := patientInfo{}
for rows.Next() {
rows.Scan(&pi_row.Patient_id, &pi_row.Name,&pi_row.Sex,&pi_row.Birthday,&pi_row.Id_no,&pi_row.Charge_type)
pi_list = append(pi_list,pi_row)
}
fmt.Println(pi_list)
b, err := json.Marshal(&pi_list)
if err != nil {
fmt.Println("error:", err)
}
fmt.Println(b)
fmt.Println(string(b[:]))
return string(b)
}
func main(){
http.HandleFunc("/",sayHelloName) //默认路径的处理
http.HandleFunc("/patientInfo",selectPatientInfo) //查询病人信息路径的处理
err:=http.ListenAndServe(":9090",nil)
if err!=nil{
log.Fatal("listenandserve: ",err)
}
}
func selectPatientInfo(w http.ResponseWriter,r *http.Request){
// 检查是否为post请求
if r.Method != http.MethodPost {
w.WriteHeader(http.StatusMethodNotAllowed)
fmt.Fprintf(w, "invalid_http_method")
return
}
//application/x-www-form-urlencoded 格式
//r.ParseForm()
//name:=r.PostFormValue("name")
//fmt.Fprintf(w, "x-www-form-urlencoded -> name="+name+"\n")
//multipart/form-data 格式
//r.ParseMultipartForm(32<<20)
//name:=r.PostFormValue("name")
//fmt.Fprintf(w, "multipart/form-data -> name="+name+"\n")
//application/json格式
defer r.Body.Close()
con, _ := ioutil.ReadAll(r.Body) //获取post的数据
//fmt.Fprintf(w, "application/json ->"+string(con))
pi := patientInfo{} //因为知道客户端传入的是一个json对象,而不是json的数据对象,所以这里没有声明成[]patientinfo{}
json.Unmarshal(con,&pi)//这个地方一定要注意使用&做引用传递,这是golang语言的特性决定的(默认都是值传递,这里相当于把对象的地址值传入了函数,函数内部用这个地址值去调用对象。)
initsql()//初始化数据库的连接我这里使用的是oracle数据库
pi_list_json := selectA(pi.Patient_id)//将获得的数据以值传递的方式传入函数,获得返回的json字符串
fmt.Fprintf(w,pi_list_json) //将查询到的数据写入流中返回
}
func sayHelloName(w http.ResponseWriter,r *http.Request)){
fmt.Fprintf(w,"hello world")
}