zoukankan      html  css  js  c++  java
  • golang实现get和post请求的服务端和客户端

    服务端

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

    getpost.go

    package main
    
    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,不然请求结果为空。

    getpostclient.go

    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
    ", 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
    ", 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
    ", string(body))
    }
    

    运行getpost.go后再运行getpostclient输出结果如下:

    Get request result: {"code":"200","msg":"登录成功"}
    
    Post request with json result: {"code":"200","msg":"登录成功"}
    
    Post request with application/x-www-form-urlencoded result: {"code":"200","msg":"登录成功"}
    
    Process finished with exit code 0
    
  • 相关阅读:
    HDU 5023 A Corrupt Mayor's Performance Art(线段树区间更新)
    CSU 1120 病毒(DP)
    CSU 1116 Kingdoms(枚举最小生成树)
    一种map容器遍历的方法
    CSU 1113 Updating a Dictionary(map容器应用)
    Python模块-virtualenv-虚拟环境
    计算学习原理
    sklearn-特征工程之特征选择
    链家网深圳租房信息分析报告
    test
  • 原文地址:https://www.cnblogs.com/cord/p/9571960.html
Copyright © 2011-2022 走看看