RCurl get response body when it errors out

626 Views Asked by At

I'm just trying to get the response body when the post request fails using RCurl. When I'm running it through R, I only get the response error and it fails out.

Error: Unprocessable Entity

when I post the same request with the UI interface for testing, it gives

{
"reason": [
    "Can not create Data with Name: DataTest. Data Name should be unique."
],
"singleReason": "Can not create Data with Name: DataTest. Data Name should be unique."
}

Any help on how to get response bodies on 4XX errors is appreciated. TIA.

Post request

postdata.json <- '{"name":"DataTest","description":"Test Payload","algorithm":{"name":"DataTest","version":"0.1.0"}}'
post.result <- httpPOST(url=SERVER, postfields = postdata.json, verbose = T,
                        httpheader=c(Authorization=access.token, 'Content-Type'='application/json', Accept='application/json'))

RStudio output

* About to connect() to SERVER port 80 (#0)
*   Trying SERVER... * connected
* Connected to SERVER port 80 (#0)
> POST /api/test HTTP/1.1
Host: SERVER
Authorization: AUTHENTICATION
Content-Type: application/json
Accept: application/json
Content-Length: 171

< HTTP/1.1 422 Unprocessable Entity
< Content-Type: application/json;charset=UTF-8
< Date: Thu, 13 Nov 2014 16:31:42 GMT
< Server: Apache-Coyote/1.1
< Content-Length: 215
< Connection: keep-alive
< 
* Connection #0 to host SERVER left intact
 Show Traceback

 Rerun with Debug
 Error: Unprocessable Entity 

n.b. I'm okay with it failing and returning an Error. That's expected. I'm just trying to get the response body associated with the error code.

2

There are 2 best solutions below

0
On BEST ANSWER

I was able to get the response body using RCurl by adding a basicTextGatherer() and a writefunction.

 reader <- basicTextGatherer()  
 post.result <- httpPOST(url=SERVER, postfields = postdata.json, verbose = T, 
                         writefunction = reader$update,
                         httpheader=c(Authorization=access.token, 
                                      'Content-Type'='application/json', 
                                      Accept='application/json')
                        )
 return(body=reader$value())

but Hadley's solution is simpler to work with and doesn't error out.

0
On

Here's one approach with httr:

library(httr)

postdata.json <- '{"name":"DataTest","description":"Test Payload","algorithm":{"name":"DataTest","version":"0.1.0"}}'

res <- POST(SERVER, 
  body = postdata.json, 
  add_headers(
    Authorization = access.token, 
    'Content-Type' = 'application/json', 
    Accept = 'application/json'
  )
)

http_status(res)
content(res)