2015-03-28 3 views
3

Я пытаюсь вызвать mailgun отправить сообщение api. Следующий код работает, если я передать Params вместе с URL -post params с groovy httpbuilder в mailgun

String targetUrl = "https://api.mailgun.net/v2/my_domain_name/messages?from=fromAddress&to=toAddress&subject=sub&text=random+message" 

Но когда я пытаюсь добавить этот Params в теле, то он не работает. Я получаю плохой запрос от 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 
     } 
    } 
} 

Спасибо!

+0

Не удается найти документы, но вы отправляете параметры запроса как тело, это неверно - используйте параметры запроса. Насколько я помню, он должен быть отправлен как карта «params», просто измените 'body' на' params'. – Opal

+0

@Opal То, что я также думал поначалу. Я попробовал параметры вместо тела. Но, похоже, у httpbuilder нет никакого свойства с именем params. – saurabh

+0

Попробуйте 'uri.query = '. – Opal

ответ

4

Ваш код не работает, потому что вы говорите 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 <[email protected]_DOMAIN_NAME>' \ 
    -F [email protected]_DOMAIN_NAME \ 
    -F [email protected] \ 
    -F subject='Hello' \ 
    -F text='Testing some Mailgun awesomness!' 

Вы можете увидеть его, используя в качестве targetURLhttp://echo.httpkit.com, который возвращает запрос HTTP в формате JSON.

Делая это, он дает:

{ 
    "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)) 
    } 
} 

, который дает это "эхо" (т. е. отправил запрос POST с параметрами urlencoded):

{ 
    "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": "/" 
}