运行环境:
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](https://static.golangjob.cn/230313/4c80fc491117140479698cad6556cceb.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](https://static.golangjob.cn/230313/8b6c28b32709e7c522245201b863f53b.png)
更多评论
既然知道是application/x-www-form-urlencoded,为什么给了一个application/json的请求内容?还是你觉得`-json=...`是为了看着好玩的?
注册个账号就是为了问一个问题?是不是功利了一点?是不是以后就消失了?
```go
http.PostForm("http://...", url.Values{"json": {`{"Parameter":[{"Name":"验证码","Value":"16386"}]}`}})
```
#1