post 参数与 groovy mailgun 中的 httpbuilder
post params with groovy httpbuilder in mailgun
我正在尝试调用 mailgun 发送消息 api。如果我将参数与 url -
一起传递,则以下代码有效
String targetUrl = "https://api.mailgun.net/v2/my_domain_name/messages?from=fromAddress&to=toAddress&subject=sub&text=random+message"
但是当我尝试在正文中添加这些参数时,它不起作用。我不断收到来自 mailgun 的错误请求。 -
String targetUrl = "https://api.mailgun.net/v2/my_domain_name/messages
body = [from:"fromAddress", to:"toAddress", subject:"sub", text:"random message"]
这是完整的代码 -
def sendEmail(String mailBody, String sub, String toIds) {
String targetUrl = "https://api.mailgun.net/v2/my_domain_name/messages"
def http = new HTTPBuilder(targetUrl)
http.request( groovyx.net.http.Method.POST, groovyx.net.http.ContentType.JSON) {
body = [from:"fromAddress", to:"toAddress", subject:"sub", text:"random message"]
headers = ['Authorization':"Basic " + "api:my_api_key".bytes.encodeBase64().toString()]
response.success = { resp, reader ->
println "valid response: " + reader
}
}
}
谢谢!
您的代码无法正常工作,因为您告诉 HTTPBuilder
请求的参数在 JSON
中编码
http.request(Method.POST, ContentType.JSON)
以便您在 JSON 中对请求 body 中的参数进行编码,而 mailgun API 期望它们具有 Content-Type: application/x-www-form-urlencoded
。
curl -s --user 'api:YOUR_API_KEY' \
https://api.mailgun.net/v2/YOUR_DOMAIN_NAME/messages \
-F from='Excited User <mailgun@YOUR_DOMAIN_NAME>' \
-F to=YOU@YOUR_DOMAIN_NAME \
-F to=bar@example.com \
-F subject='Hello' \
-F text='Testing some Mailgun awesomness!'
您可以看到它使用 targetURL
http://echo.httpkit.com,即 returns JSON 格式的 HTTP 请求。
这样做,它产生:
{
"body": "\"from\":\"fromAddress\",\"to\":\"toAddress\",\"subject\":\"sub\",\"text\":\"random message\"}",
"docs": "http://httpkit.com/echo",
[...]
所以你必须使用 ContentType.URLENC
而不是 ContentType.JSON
(并且可以选择使用 Accept
header 作为 application/json
类型):
import groovy.json.*
import groovyx.net.*
import groovyx.net.http.*
import static groovy.json.JsonOutput.*
import static groovyx.net.http.ContentType.*
import static groovyx.net.http.Method.*
String targetUrl = 'http://echo.httpkit.com'
def http = new HTTPBuilder(targetUrl)
http.request(POST) {
uri.path = '/'
requestContentType = URLENC
body = [from: 'fromAddress', to: 'toAddress', subject: 'sub', text: 'random message']
headers.'Authorization' = "Basic " + "api:my_api_key".bytes.encodeBase64().toString()
headers.'Accept' = 'application/json'
response.success = { resp, json ->
println prettyPrint(toJson(json))
}
}
这会产生此 "echo" 响应(即发送带有 urlencoded 参数的 POST 请求):
{
"body": "from=fromAddress&to=toAddress&subject=sub&text=random+message",
"docs": "http://httpkit.com/echo",
"headers": {
"accept": "application/json",
"authorization": "Basic YXBpOm15X2FwaV9rZXk=",
"content-length": "61",
"content-type": "application/x-www-form-urlencoded",
"host": "echo.httpkit.com",
"x-forwarded-for": "195.235.15.200"
},
"ip": "127.0.0.1",
"method": "POST",
"path": {
"name": "/",
"params": {
},
"query": ""
},
"powered-by": "http://httpkit.com",
"uri": "/"
}
我正在尝试调用 mailgun 发送消息 api。如果我将参数与 url -
一起传递,则以下代码有效String targetUrl = "https://api.mailgun.net/v2/my_domain_name/messages?from=fromAddress&to=toAddress&subject=sub&text=random+message"
但是当我尝试在正文中添加这些参数时,它不起作用。我不断收到来自 mailgun 的错误请求。 -
String targetUrl = "https://api.mailgun.net/v2/my_domain_name/messages
body = [from:"fromAddress", to:"toAddress", subject:"sub", text:"random message"]
这是完整的代码 -
def sendEmail(String mailBody, String sub, String toIds) {
String targetUrl = "https://api.mailgun.net/v2/my_domain_name/messages"
def http = new HTTPBuilder(targetUrl)
http.request( groovyx.net.http.Method.POST, groovyx.net.http.ContentType.JSON) {
body = [from:"fromAddress", to:"toAddress", subject:"sub", text:"random message"]
headers = ['Authorization':"Basic " + "api:my_api_key".bytes.encodeBase64().toString()]
response.success = { resp, reader ->
println "valid response: " + reader
}
}
}
谢谢!
您的代码无法正常工作,因为您告诉 HTTPBuilder
请求的参数在 JSON
http.request(Method.POST, ContentType.JSON)
以便您在 JSON 中对请求 body 中的参数进行编码,而 mailgun API 期望它们具有 Content-Type: application/x-www-form-urlencoded
。
curl -s --user 'api:YOUR_API_KEY' \ https://api.mailgun.net/v2/YOUR_DOMAIN_NAME/messages \ -F from='Excited User <mailgun@YOUR_DOMAIN_NAME>' \ -F to=YOU@YOUR_DOMAIN_NAME \ -F to=bar@example.com \ -F subject='Hello' \ -F text='Testing some Mailgun awesomness!'
您可以看到它使用 targetURL
http://echo.httpkit.com,即 returns JSON 格式的 HTTP 请求。
这样做,它产生:
{
"body": "\"from\":\"fromAddress\",\"to\":\"toAddress\",\"subject\":\"sub\",\"text\":\"random message\"}",
"docs": "http://httpkit.com/echo",
[...]
所以你必须使用 ContentType.URLENC
而不是 ContentType.JSON
(并且可以选择使用 Accept
header 作为 application/json
类型):
import groovy.json.*
import groovyx.net.*
import groovyx.net.http.*
import static groovy.json.JsonOutput.*
import static groovyx.net.http.ContentType.*
import static groovyx.net.http.Method.*
String targetUrl = 'http://echo.httpkit.com'
def http = new HTTPBuilder(targetUrl)
http.request(POST) {
uri.path = '/'
requestContentType = URLENC
body = [from: 'fromAddress', to: 'toAddress', subject: 'sub', text: 'random message']
headers.'Authorization' = "Basic " + "api:my_api_key".bytes.encodeBase64().toString()
headers.'Accept' = 'application/json'
response.success = { resp, json ->
println prettyPrint(toJson(json))
}
}
这会产生此 "echo" 响应(即发送带有 urlencoded 参数的 POST 请求):
{
"body": "from=fromAddress&to=toAddress&subject=sub&text=random+message",
"docs": "http://httpkit.com/echo",
"headers": {
"accept": "application/json",
"authorization": "Basic YXBpOm15X2FwaV9rZXk=",
"content-length": "61",
"content-type": "application/x-www-form-urlencoded",
"host": "echo.httpkit.com",
"x-forwarded-for": "195.235.15.200"
},
"ip": "127.0.0.1",
"method": "POST",
"path": {
"name": "/",
"params": {
},
"query": ""
},
"powered-by": "http://httpkit.com",
"uri": "/"
}