golang webAPI

后端 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")
}

你可能感兴趣的:(go,go)