为了账号安全,请及时绑定邮箱和手机立即绑定

将编组的 JSON 数据发布为 URL 编码的表单数据

将编组的 JSON 数据发布为 URL 编码的表单数据

Go
MMTTMM 2022-12-19 11:59:06
我正在尝试通过将 auth 结构转换为application/x-www-form-urlencoded数据来发送 POST 请求。package mainimport (    "bytes"    "encoding/json"    "io/ioutil"    "log"    "net/http")type Payload struct {    Username string `json:"username"`    Password string `json:"password"`    GrantType string `json:"grant_type"`    Scope string `json:"scope"`}func main() {    var endpoint string = "https://api.io/v1/oauth/token"    jsonPay := &Payload{        Username: "email",        Password: "pass",        GrantType: "password",        Scope: "SPACE SEPARATED STRINGS",    }    //byteArr, err := json.Marshal(jsonPay)    //if err != nil {    //    log.Printf("Unable to map structure\n%v", err)    //}    payloadBuf := new(bytes.Buffer)    json.NewEncoder(payloadBuf).Encode(jsonPay)    req, err := http.NewRequest("POST", endpoint, payloadBuf)    if err != nil {        log.Fatal(err)    }    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")    req.Header.Add("Accept", "application/json")    resp, err := http.DefaultClient.Do(req)    if err != nil {        log.Fatal(err)    }    defer resp.Body.Close()    body, err := ioutil.ReadAll(resp.Body)    if err != nil {        log.Fatal(err)    }    log.Printf(string(body))}我试过了:发送一个 JSON 编码的负载缓冲区,它返回{"error":"invalid_request","error_description":"Missing grant type"}与编组的 JSON 对象一起使用bytes.NewReader,它也返回{"error":"invalid_request","error_description":"Missing grant type"}strings.NewReader与 JSON 编码的负载缓冲区一起使用,它返回cannot use payloadBuf (variable of type *bytes.Buffer) as type string in argument to strings.NewReader
查看完整描述

1 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

实施了@RedBlue 的建议:


package main


import (

    "io/ioutil"

    "log"

    "net/http"

    "strings"

    "net/url"

)


type Payload struct {

    Username string `json:"username"`

    Password string `json:"password"`

    GrantType string `json:"grant_type"`

    Scope string `json:"scope"`

}


func main() {


    const endpoint string = "https://api.io/v1/oauth/token"


    formData := &Payload{

        Username: "email",

        Password: "pass",

        GrantType: "password",

        Scope: "SPACE SEPARATED STRINGS",

    }


    payload := url.Values{

        "username":   {formData.Username},

        "password":   {formData.Password},

        "grant_type": {formData.GrantType},

        "scope":      {formData.Scope},

    }


    req, err := http.NewRequest("POST", endpoint, strings.NewReader(payload.Encode()))

    if err != nil {

        log.Printf("Unable to perform POST request:\n%v", err)

    }

    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")

    req.Header.Add("Accept", "application/json")


    resp, err := http.DefaultClient.Do(req)

    if err != nil {

        log.Fatal(err)

    }

    defer resp.Body.Close()


    body, err := ioutil.ReadAll(resp.Body)

    if err != nil {

        log.Fatal(err)

    }

    log.Println(string(body))

}



查看完整回答
反对 回复 2022-12-19
  • 1 回答
  • 0 关注
  • 68 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信