意外错误400:错误请求HttpBuilder POST请求

时间:2013-12-13 19:35:47

标签: grails groovy httpbuilder

我正在使用此代码将JSON对象POST到URL groovy:

def http = new HTTPBuilder( 'myURL' )

// perform a POST request, expecting JSON response data
http.request( POST, JSON ) {
uri.path = myPath
uri.query = [ service_key:'1.0', event_type: 'trigger' ]
headers.'Content-Type' = 'application/json'

// response handler for a success response code:
response.success = { resp, json ->
println resp.status

// parse the JSON response object:
 json.responseData.results.each {
 ret = json.getText()
 println 'Response data: -----'
 println ret
 println '--------------------'
}
}

// handler for any failure status code:
response.failure = { resp ->
println "Unexpected error: ${resp.status} : ${resp.statusLine.reasonPhrase}"
}
}

  Ajax Code that works:(EDITED)
 $.ajax({       url:'https://events.pagerduty.com/generic/2010-04-15/create_event.json',                                                                       
            type: 'POST',
        contentType: 'application/json',
        data: JSON.stringify({

              service_key: "1379ca7018e94343bf5fa5add9fa42eb",
                 incident_key: "srv01/HTTP",
                event_type: "trigger",
                description: "TEst Test"
     }),
     dataType:'json'
     });
     alert('Message Sent');

每次我收到意外错误:400:错误请求,同样的事情,如果我用$ .ajax()它可以工作。我在响应中得到HTTP:200 OK。这里出了什么问题?

谢谢。

2 个答案:

答案 0 :(得分:2)

在ajax示例中,您将4个元素作为JSON主体传递,最终会像这样:

{"service_key": "1379ca7018e94343bf5fa5add9fa42eb",
 "incident_key": "srv01/HTTP",
 "event_type": "trigger",
 "description": "TEst Test"}

但是在groovy示例中,您只传递了两个查询字符串参数(将在uri上传递)。

您应该替换

uri.query = [ service_key:'1.0', event_type: 'trigger' ]

使用:

body =  [service_key:'1.0', incident_key: "srv01/HTTP", event_type: 'trigger' description: "TEst Test"]

您还应该在失败响应处理程序中输出响应数据,因为许多服务将为您描述您未达到服务合同的原因。

答案 1 :(得分:0)

如果您有权访问要从中请求数据的服务器,则应查看日志文件。

错误请求通常意味着网络服务器不喜欢您的URL,查询字符串或HTTP标头。如果您可以进入服务器,您可能会获得更多详细信息。

否则,有没有办法在执行HTTP帖子之前记录您的请求对象?

另外 - 仔细检查您的JSON数据是否格式正确。在某些框架中,我需要在将JSON发送到请求对象之前将其转义。尝试记录它,并查看您的框架是否要求您处理(或甚至parse数据到字典/关联数组类型结构。