简单http

服务端

在​​golang​​​中,实现一个普通的​​http​​​接口可以处理​​get​​​请求和​​x-www-form-urlencoded​​​类型的​​post​​​请求,而如果想实现处理​​json​​​数据的​​post​​​请求,则需要用另外的方式实现,接收的参数要从​​request.Body​​中读取:

import (
"net/http"
"encoding/json"
"log"
)

func main() {

http.HandleFunc("/login1", login1)
http.HandleFunc("/login2", login2)
http.ListenAndServe("0.0.0.0:8080", nil)
}

type Resp struct {
Code string `json:"code"`
Msg string `json:"msg"`
}

type Auth struct {
Username string `json:"username"`
Pwd string `json:"password"`
}

//post接口接收json数据
func login1(writer http.ResponseWriter, request *http.Request) {
var auth Auth
if err := json.NewDecoder(request.Body).Decode(&auth); err != nil {
request.Body.Close()
log.Fatal(err)
}
var result Resp
if auth.Username == "admin" && auth.Pwd == "123456" {
result.Code = "200"
result.Msg = "登录成功"
} else {
result.Code = "401"
result.Msg = "账户名或密码错误"
}
if err := json.NewEncoder(writer).Encode(result); err != nil {
log.Fatal(err)
}
}

//接收x-www-form-urlencoded类型的post请求或者普通get请求
func login2(writer http.ResponseWriter, request *http.Request) {
request.ParseForm()
username, uError := request.Form["username"]
pwd, pError := request.Form["password"]

var result Resp
if !uError || !pError {
result.Code = "401"
result.Msg = "登录失败"
} else if username[0] == "admin" && pwd[0] == "123456" {
result.Code = "200"
result.Msg = "登录成功"
} else {
result.Code = "203"
result.Msg = "账户名或密码错误"
}
if err := json.NewEncoder(writer).Encode(result); err != nil {
log.Fatal(err)
}
}
客户端

golang的标准api中用于http客户端请求的主要有三个api : ​​http.Get,http.Post,http.PostForm​​,其区别如下:

api

作用

http.Get

发送get请求

http.Post

post请求提交指定类型的数据

http.PostForm

post请求提交application/x-www-form-urlencoded数据

在使用http客户端api的时候要注意一个问题:请求地址的url必须是带​​http://​​协议头的完整url,不然请求结果为空。

package main

import (
"net/http"
"fmt"
"io/ioutil"
"net/url"
"encoding/json"
"bytes"
)

type auth struct {
Username string `json:"username"`
Pwd string `json:"password"`
}

func main() {
get()
postWithJson()
postWithUrlencoded()
}

func get() {
//get请求
//http.Get的参数必须是带http://协议头的完整url,不然请求结果为空
resp, _ := http.Get("http://localhost:8080/login2?username=admin&password=123456")
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
//fmt.Println(string(body))
fmt.Printf("Get request result: %s\n", string(body))
}

func postWithJson() {
//post请求提交json数据
auths := auth{"admin","123456"}
ba, _ := json.Marshal(auths)
resp, _ := http.Post("http://localhost:8080/login1","application/json", bytes.NewBuffer([]byte(ba)))
body, _ := ioutil.ReadAll(resp.Body)
fmt.Printf("Post request with json result: %s\n", string(body))
}

func postWithUrlencoded() {
//post请求提交application/x-www-form-urlencoded数据
form := make(url.Values)
form.Set("username","admin")
form.Add("password","123456")
resp, _ := http.PostForm("http://localhost:8080/login2", form)
body, _ := ioutil.ReadAll(resp.Body)
fmt.Printf("Post request with application/x-www-form-urlencoded result: %s\n", string(body))

beego框架

有人评论我就更新

引用

​​golang实现get和post请求的服务端和客户端​​