高级:我的程序得到一个长URL,并使它更短(比如tinyurl)。但是我在将长URL变量和shortURL变量从函数传递到mySQL数据库时遇到了问题。我已经试着在网上查过了,但是我所得到的信息与我所拥有的不太接近。我只发布了我的部分代码,完整的代码将在游乐场中
var db *sql.DB //global variable
func main(){
var db, err = sql.Open("mysql", dsn())
if err != nil {
fmt.Println(err.Error())
} else {
fmt.Printf("Connection established to MYSQL server\n%s\n", dsn())
}
defer db.Close()
linkList = map[string]string{}
http.HandleFunc("/link", addLink)
http.HandleFunc("/hpe/", getLink)
http.HandleFunc("/", Home)
// Flags to pass string ip or port to WEB app
ip := flag.String("i", "0.0.0.0", "")
port := flag.String("p", "8080", "")
flag.Parse()
fmt.Printf("Web application listening on %s \n", net.JoinHostPort(*ip, *port))
log.Fatal(http.ListenAndServe(net.JoinHostPort(*ip, *port), nil))
}函数,该函数创建短url。每次调用此函数时,它都会生成链接。
func addLink(w http.ResponseWriter, r *http.Request) {
log.Println("Add Link")
key, ok := r.URL.Query()["ik"]
if ok {
if !validLink(key[0]) {
w.WriteHeader(http.StatusBadRequest)
fmt.Fprintf(w, "Could not create shortlink need absolute path link.")
return
}
log.Println(key)
if _, ok := linkList[key[0]]; !ok {
genString := randomString(5)
linkList[genString] = key[0]
w.Header().Set("Content-Type", "text/html")
w.WriteHeader(http.StatusAccepted)
linkString := fmt.Sprintf("<a href=\"hpe/%s\">hpe/%s</a>", genString, genString)
fmt.Fprintf(w, "Added shortlink\n")
fmt.Fprintf(w, linkString)
return
// database function
defer db.Close()
s:
result, err := db.Exec("insert into Url (LongUrl, ShortUrl) value(?,?);",genString,linkString)
if err != nil {
fmt.Print(err.Error())
} else {
_,err:=result.LastInsertId()
}
}
w.WriteHeader(http.StatusConflict)
fmt.Fprintf(w, "Already have this link")
return
}
w.WriteHeader(http.StatusBadRequest)
fmt.Fprintf(w, "Failed to add link")
return
}func getLink(w http.ResponseWriter, r *http.Request) {
path := r.URL.Path
log.Println("Get Link:", path)
pathArgs := strings.Split(path, "/")
if len(pathArgs[2]) < 1 {
w.WriteHeader(http.StatusNotFound)
http.Redirect(w, r, "0.0.0.0:8080", http.StatusTemporaryRedirect)
return
}
log.Printf("Redirected to: %s", linkList[pathArgs[2]])
http.Redirect(w, r, linkList[pathArgs[2]], http.StatusTemporaryRedirect)
//fmt.Printf("all %s", linkList)
return
}我的期望是,当func被调用时,从长和短url生成的信息就会像在代码中那样被放入数据库。
发布于 2022-12-04 00:44:15
如果问题是在调用addLink时没有向db添加任何内容,那么问题看起来是因为在创建和打印linkString var之后,以及在调用db.Exec之前,addLink中有一个返回语句。
https://stackoverflow.com/questions/74645024
复制相似问题