【问题标题】:Sendgrid adding email to list, getting bad request in grailsSendgrid将电子邮件添加到列表中,在grails中收到错误请求
【发布时间】:2023-03-06 01:09:01
【问题描述】:

我正在尝试使用以下代码向 sendgrid 发送请求以将电子邮件添加到列表,但我总是收到 404 : Bad request。

def chttps = new HTTPBuilder('https://api.sendgrid.com/api/newsletter/lists/email/add.json?&api_user=myUser&api_key=myKey')

    chttps.request( Method.POST, ContentType.JSON ) { req ->
        headers.'Content-Type' = 'application/json'
        body = [
            list : 'testlist',
            data : [email : '123Ex@exm.pl', name : '123Ex' ]
        ]

        response.success = { resp, json ->
            // response handling here
        }
        // handler for any failure status code:

    }

以下是我得到的错误:

    Bad Request. Stacktrace follows:
    groovyx.net.http.HttpResponseException: Bad Request
    at groovyx.net.http.HTTPBuilder.defaultFailureHandler(HTTPBuilder.java:609)
    at groovyx.net.http.HTTPBuilder.doRequest(HTTPBuilder.java:475)
     at groovyx.net.http.HTTPBuilder.doRequest(HTTPBuilder.java:417)
     at groovyx.net.http.HTTPBuilder.request(HTTPBuilder.java:366)
    at com.farmfresh.brandywine.erp.SendGridService$$EOc3vKl8.addEmailsToRecipientList(SendGridService.groovy:16)
    at com.farmfresh.brandywine.erp.CustomerController$_closure5$$EOc3pEvI.doCall(CustomerController.groovy:106)
    at org.zkoss.zk.grails.web.ZKGrailsPageFilter.obtainContent(ZKGrailsPageFilter.java:238)
    at org.zkoss.zk.grails.web.ZKGrailsPageFilter.doFilter(ZKGrailsPageFilter.java:189)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    at java.lang.Thread.run(Thread.java:662)

找不到问题所在。请帮忙。

编辑1:

所以我尝试使用以下代码,它工作正常,但仍然无法在数据部分指定电子邮件列表:

            def chttps = new HTTPBuilder('https://api.sendgrid.com/api/newsletter/lists/email/add.json?&api_user=myUser&api_key=myKey')
            def dataa = "list=testlist&data=%7B%22email%22%3A%22examuttample%40gmail.com%22%2C%22name%22%3A%22uttam%22%7D"
            chttps.post(  body: dataa
                            ) { resp ->
                            println "${resp}"
                         resp.headers.each {
                                println "${it.name} : ${it.value}"
                         }
                            println "${resp.data}"

                            println "http POST Success: ${resp.statusLine}"
                        }

为了在单个请求中添加多封电子邮件,我尝试使用以下格式:

data=%5B%7B%22email%22%3A+%22example1112%40gmail.com%22%2C%22name%22%3A+%22112example%22%7D%2C%7B%22email%22%3A+%22example2222%40gmail.com%22%2C%22name%22%3A+%22222example%22%7D%5D 
//encode for :: [{"email": "example1112@gmail.com","name": "112example"},{"email": "example2222@gmail.com","name": "222example"}]

但我不断收到以下异常,有没有办法解决这个问题来添加多封电子邮件。

    groovyx.net.http.HttpResponseException: Internal Server Error
at groovyx.net.http.HTTPBuilder.defaultFailureHandler(HTTPBuilder.java:642)
at groovyx.net.http.HTTPBuilder$1.handleResponse(HTTPBuilder.java:494)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:1070)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:1044)
at groovyx.net.http.HTTPBuilder.doRequest(HTTPBuilder.java:506)
at groovyx.net.http.HTTPBuilder.post(HTTPBuilder.java:343)
at com.farmfresh.brandywine.erp.SendGridService$$EOc9RNxT.addEmailsToRecipientList(SendGridService.groovy:40)
at com.farmfresh.brandywine.erp.CustomerController$_closure5$$EOc9QqKy.doCall(CustomerController.groovy:109)
at org.zkoss.zk.grails.web.ZKGrailsPageFilter.obtainContent(ZKGrailsPageFilter.java:238)
at org.zkoss.zk.grails.web.ZKGrailsPageFilter.doFilter(ZKGrailsPageFilter.java:189)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:662)

【问题讨论】:

    标签: grails sendgrid httpbuilder


    【解决方案1】:

    您似乎正在尝试发布 JSON 有效负载。 SendGrid API 当前不支持 JSON 负载,因此您需要将负载作为 POST 数据发送。

    【讨论】:

    • 感谢提示,我对数据部分进行了编码并根据它更新了代码(请查看有问题的编辑),但我仍然无法添加多个电子邮件来请求.如果可以的话,我会投票,但我需要声誉
    【解决方案2】:

    解决了,结果服务器不接受 json 数组,而是接受查询字符串中的多个“data[]”元素,所以你需要做的就是调用这个:

    sendgrid.com/api/newsletter/lists/email/add.json?list=testlist&data[]={"email"+%3A+"123Ex1%40exm.pl"%2C+"name"+%3A+"123Ex1"}&data[]={"email"+%3A+"123Ex2%40exm.pl"%2C+"name"+%3A+"123Ex2"}&api_user=myUser&api_key=myKey
    

    希望这对其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-23
      • 1970-01-01
      • 1970-01-01
      • 2015-07-17
      • 1970-01-01
      相关资源
      最近更新 更多