【问题标题】:post params with groovy httpbuilder in mailgun在 mailgun 中使用 groovy httpbuilder 发布参数
【发布时间】:2015-03-28 03:54:19
【问题描述】:

我正在尝试调用 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
        }
    }
}

谢谢!

【问题讨论】:

  • 找不到文档,但您将查询参数作为正文发送,这是不正确的 - 使用查询参数。据我记得它应该作为params 地图发送,只需将body 更改为params
  • @Opal 我一开始也是这么想的。我尝试用 params 代替 body。但似乎 httpbuilder 没有任何名为 params 的属性。
  • 试试uri.query = <map with params>

标签: groovy mailgun httpbuilder


【解决方案1】:

您的代码不起作用,因为您告诉 HTTPBuilder 请求的参数在 JSON 中编码

http.request(Method.POST, ContentType.JSON)

这样您就可以将请求正文中的参数编码为 JSON,而 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 来查看它,它以 JSON 格式返回 HTTP 请求。

这样做,它会产生:

{
    "body": "\"from\":\"fromAddress\",\"to\":\"toAddress\",\"subject\":\"sub\",\"text\":\"random message\"}",
"docs": "http://httpkit.com/echo",
[...]

所以你必须使用ContentType.URLENC 而不是ContentType.JSON(并且可以选择使用Accept 标头作为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))
    }
}

这会产生这个“回声”响应(即,发送一个带有 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": "/"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    相关资源
    最近更新 更多