Le titre est long
Ajout d'un processus pour mettre à jour les événements du calendrier à partir de l'application Rails avec l'API Google Calendar, extraire des attributs spécifiques de la réponse et les gérer. Étant donné que le JSON reçu dans la réponse est converti par google-api-ruby-client en un objet de la classe Google :: API :: V3 :: Event, la réponse de la requête de stub est également convertie par ruby-client ou une structure similaire est utilisée. Je devais en faire un objet que j'avais.
TL;DR
Le code ci-dessous demande à l'aide de google-api-ruby-client et tente d'obtenir l'ID d'événement à partir de la réponse
demande
service = Google::Apis::CalendarV3::CalendarService.new
service.authorization = access_token
response = service.update_event('primary', event_id, body)
event_id = response.id
A ce moment, la "réponse" est la suivante.
#<Google::Apis::CalendarV3::Event:0x000055c94da58f18
@attachments=[],
@attendees=[#<Google::Apis::CalendarV3::EventAttendee:xxxxxxxxxxxxxxxxxxx @email="[email protected]", @organizer=true, @self=true>],
@created=Mon, 01 Jan 2020 00:00:00 +0000,
@creator=#<Google::Apis::CalendarV3::Event::Creator:xxxxxxxxxxxxxxxxxxx @email="[email protected]", @self=true>,
@description="",
@end=#<Google::Apis::CalendarV3::EventDateTime:xxxxxxxxxxxxxxxxxxx>,
@etag="xxxxxxxxxxxxxxxxxxx",
@id="abcdefghijklmnopqrstu",
@organizer=#<Google::Apis::CalendarV3::Event::Organizer:xxxxxxxxxxxxxxxxxxx @email="[email protected]">,
@start=#<Google::Apis::CalendarV3::EventDateTime:xxxxxxxxxxxxxxxxxxx>,
@updated=Mon, 01 Jan 2020 00:00:00 +0000>
Par conséquent, la valeur peut être obtenue à partir de l'objet response
avec la méthode getter ʻid`.
En revanche, dans la plupart des cas, la réponse API sera définie dans RSpec comme suit.
let(:response) do
{
id: 'abcdefghijklmnopqrstu',
start: { date_time: Time.zone.today },
end: { date_time: Time.zone.today },
html_link: 'https://www.google.com/calendar/event?eid=xxxxxxxxxxxxxxxxxxxxxxxxxxxx',
i_cal_uid: '[email protected]',
summary: 'event name',
updated: Time.zone.today,
...
}.to_json
end
Dans ce cas, pour obtenir l'ID d'événement, il est nécessaire de faire quelque chose comme JSON.parse (response) ['id']
, et response.id
devient NoMethodError.
Afin de renvoyer cette réponse au format JSON en tant qu'objet de classe Event, il est nécessaire d'ajouter `` X-Goog-Upload-Status ':' final '' à l'en-tête de la réponse comme indiqué ci-dessous.
stub_request(
:put, url
).to_return(
status: 201,
body: response,
headers: {
content_type: 'application/json',
'X-Goog-Upload-Status': 'final'
}
)
[Des informations d'en-tête similaires sont ajoutées à la réponse] dans les spécifications de test de google-api-ruby-client (https://github.com/googleapis/google-api-ruby-client/blob/29f9544b1497358888cd93175e5579cab83fd247/spec/ google / apis / core / upload_spec.rb # L154).
Il est arrivé que mon collègue ait immédiatement trouvé un article et un problème sur GitHub, alors je l'ai résolu, mais sinon, je pense que j'en ai été accro pendant 3 jours.