运行环境: 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运行结果
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运行结果
有疑问加站长微信联系(非本文作者)

既然知道是application/x-www-form-urlencoded,为什么给了一个application/json的请求内容?还是你觉得
-json=...
是为了看着好玩的? 注册个账号就是为了问一个问题?是不是功利了一点?是不是以后就消失了?多谢大佬指点,这次是工作中,突然想用go写个小工具(目前也不熟悉,趁这机会学然后写的)。后续自己尽量多花时间学习,争取能了解的深入一点
大体上可以了。非常感谢大佬