0

J'ai cherché beaucoup d'autres questions et je ne vois pas que je fais quelque chose de différent, mais reste-client ne fonctionnera pas en essayant de publier un nouvel événement à l'API GoogleRails POST à ​​l'API Google Calender via rest-client donne une erreur 'mauvaise demande'

url = "https://www.googleapis.com/calendar/v3/calendars/primary/events?access_token=#{token}" 
params = {start: 'test'}.to_json 
response = RestClient.post url, params 

RestClient::BadRequest (400 Bad Request) 
+0

[400: Bad Request] (https://developers.google.com/drive/v3/web/handle-errors#400_bad_request) erreur signifie qu'un champ obligatoire ou un paramètre n'a pas été fourni, que la valeur fournie n'est pas valide ou que la combinaison des champs fournis n'est pas valide. Ce [problème de GitHub] (https://github.com/recurser/pivotal-to-trello/issues/2) a suggéré d'essayer de passer à ssl: 'PivotalTracker :: Client.use_ssl = true'. Cette [publication SO] (http://stackoverflow.com/questions/35176313/rails-restclient-post-request-failing-with-400-bad-request) pourrait également aider. – abielita

Répondre

0

Notez que vous pouvez être intéressé à utiliser bibliothèque client de Google pour Ruby au lieu de simplement RESTClient:

https://developers.google.com/api-client-library/ruby/start/installation


Résolution du problème avec RestClient

Vous pouvez extraire le message d'erreur de l'exception HTTP 400.

Voici ce que je vois:

auth_header 'Bearer zzzz...' 
base_url = 'https://www.googleapis.com/calendar/v3/calendars/primary' 
event = {'summary': 'Test RestClient event', 'start': {'dateTime': Time.now.strftime('%FT%T%z')}, 'end': {'dateTime': (Time.now + 3600).strftime('%FT%T%z')}} 

begin 
    RestClient.post(base_url + '/events', event.to_json, {authorization: auth_header}) 
rescue RestClient::BadRequest => err 
    puts err.response.body 
end 

qui imprime cette HTTP 400 réponse:

{ 
"error": { 
    "errors": [ 
    { 
    "domain": "global", 
    "reason": "parseError", 
    "message": "This API does not support parsing form-encoded input." 
    } 
    ], 
    "code": 400, 
    "message": "This API does not support parsing form-encoded input." 
} 
} 

Qu'est-ce qui se passe ici? RestClient suppose que vous voulez une demande Content-Type de application/x-www-form-urlencoded sauf indication contraire.

Donc, si l'on ajoute l'en-tête Content-Type: application/json correct, tout fonctionne comme prévu:

>> RestClient.post(base_url + '/events', event.to_json, {authorization: auth_header, content_type: :json}) 
=> <RestClient::Response 200 "{\n \"kind\": ..."> 

Suppression de réponse avant qui ne résout pas le problème

+0

J'ai vu d'autres exemples qui font. J'ai également essayé de le déplacer, en le sortant de l'url et en changeant les paramètres pour: 'params = {access_token: jeton, début:" test "}. To_json' et a obtenu une erreur non autorisée. – justindfunk