go调用http包发送post请求 ,返回400状态码(this page expects a form submission)

Liz8202 · 2023-03-13 10:24:58 · 2003 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2023-03-13 10:24:58 的主题,其中的信息可能已经有所发展或是发生改变。

运行环境: go 1.19.1 windows/amd64

问题描述: 通过 http 提供的 PostForm,NewRequest,Post 方法发送 post 请求,调用 jenkins pipeline 的 input 输入处理接口,始终调用无法成功,返回结果状态码为 400,消息体提示 this page expects a form submission。同样的参数和 URI 通过 curl 命令,接口可以正常调用并返回 200 状态码

CURL命令(状态码200,成功触发接口):

curl -s -w "%{http_code}\n" -X POST 'http://liuzhichao:88cd35a7db9b614818be840370d1cef3@172.16.99.11:8080/job/dwglptyq/job/sc-cpjob/17/wfapi/inputSubmit?inputId=Inputap' -d 'json={"Parameter":[{"Name":"验证码","Value":"16386"}]}'
CURL运行结果

image.png go相关代码(返回结果状态码为 400,消息体提示 this page expects a form submission):

结构体定义:(保存参数)
//接收参数的类型
type Parameter struct {
    Parameter []Pvalue
}

//参数的值
type Pvalue struct {
    Name  string
    Value string
}

//序列化json
func (p Parameter) MarshalJSON() ([]byte, error) {
    return json.Marshal(&struct {
        Parameter []Pvalue `json:"Parameter,omitempty"`
    }{
        Parameter: p.Parameter,
    })
}

参数构建
            fmt.Scanf("%s\n",&valiCode)
            parameters := Parameter{
                Parameter: []Pvalue{
                    Pvalue{
                        Name: "验证码",
                        Value: valiCode,
                    },
                },
            }

调用
InvokRequest("POST","http://" + jenkinsUser + ":" + jenkinsToken + "@" + jenkinsAddr + "/job/dwglptyq/job/sc-cpjob/" + fmt.Sprintf("%v",buildNumber) + "/wfapi/inputSubmit?inputId=Inputap",parameters)

处理
func InvokRequest(httpMethod string,requestUrl string,params Parameter){
    fmt.Println("method:" + httpMethod +",requestUrl:" + requestUrl)

    if httpMethod == "POST" {
        client := &http.Client{}
        bytesData, _ := json.Marshal(params)
        fmt.Printf("bytesData:%v\n", bytesData)
        fmt.Printf("stringvalu:%v\n", string(bytesData))
        // req, _ := http.NewRequest("POST",requestUrl,bytes.NewReader(bytesData))
        // resp, _ := client.Do(req)
        // defer resp.Body.Close()
        // body, _ := ioutil.ReadAll(resp.Body)
        // fmt.Println(string(body))


        param := bytes.NewBuffer([]byte(bytesData))

        //构建http请求
        client = &http.Client {
        }

        req, err := http.NewRequest(httpMethod, requestUrl, param)
        if err != nil {
            fmt.Println(err)
            return
        }

        //设置请求头
        req.Header.Add("Content-Type", "application/x-www-form-urlencoded")

        //发送请求
        res, err := client.Do(req)
        if err != nil {
            fmt.Println(err)
            return
        }
        defer res.Body.Close()

        //返回结果
        body, err := ioutil.ReadAll(res.Body)
        if err != nil {
            fmt.Println(err)
            return
        }
        fmt.Println(string(body))
    }
}

go运行结果 image.png


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2003 次点击  
加入收藏 微博
3 回复  |  直到 2023-03-13 19:44:45
Neightly
Neightly · #1 · 2年之前

既然知道是application/x-www-form-urlencoded,为什么给了一个application/json的请求内容?还是你觉得-json=...是为了看着好玩的? 注册个账号就是为了问一个问题?是不是功利了一点?是不是以后就消失了?

http.PostForm("http://...", url.Values{"json": {`{"Parameter":[{"Name":"验证码","Value":"16386"}]}`}})
Liz8202
Liz8202 · #2 · 2年之前

多谢大佬指点,这次是工作中,突然想用go写个小工具(目前也不熟悉,趁这机会学然后写的)。后续自己尽量多花时间学习,争取能了解的深入一点

Liz8202
Liz8202 · #3 · 2年之前

大体上可以了。非常感谢大佬

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传