Der Titel ist lang
Es wurde ein Prozess hinzugefügt, mit dem Ereignisse im Kalender aus der Rails-Anwendung mit der Google Kalender-API aktualisiert, bestimmte Attribute aus der Antwort extrahiert und verarbeitet werden können. Da der in der Antwort empfangene JSON von google-api-ruby-client in ein Objekt der Klasse Google :: API :: V3 :: Event konvertiert wird, wird die Antwort der Stub-Anforderung auch von ruby-client konvertiert oder eine ähnliche Struktur verwendet. Ich musste es zu einem Objekt machen, das ich hatte.
TL;DR
Der folgende Code fordert die Verwendung von google-api-ruby-client an und versucht, die Ereignis-ID aus der Antwort abzurufen
Anfrage
service = Google::Apis::CalendarV3::CalendarService.new
service.authorization = access_token
response = service.update_event('primary', event_id, body)
event_id = response.id
Zu diesem Zeitpunkt lautet die Antwort wie folgt.
#<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>
Daher können Sie den Wert vom response
-Objekt mit der getter-Methode id
abrufen.
Andererseits wird in den meisten Fällen die API-Antwort in RSpec wie folgt definiert.
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
In diesem Fall ist es zum Abrufen der Ereignis-ID erforderlich, etwas wie "JSON.parse (response) [" id "]" auszuführen, und "response.id" wird zu NoMethodError.
Um diese Antwort im JSON-Format als Ereignisklassenobjekt zurückzugeben, muss dem Antwortheader wie unten gezeigt "X-Goog-Upload-Status": "final" hinzugefügt werden.
stub_request(
:put, url
).to_return(
status: 201,
body: response,
headers: {
content_type: 'application/json',
'X-Goog-Upload-Status': 'final'
}
)
[Ähnliche Header-Informationen werden zur Antwort hinzugefügt] in den Testspezifikationen von google-api-ruby-client (https://github.com/googleapis/google-api-ruby-client/blob/29f9544b1497358888cd93175e5579cab83fd247/spec/) google / apis / core / upload_spec.rb # L154).
Es kam vor, dass mein Kollege sofort einen Artikel und ein Problem auf GitHub fand, also habe ich es gelöst, aber wenn nicht, war ich 3 Tage lang süchtig danach.
Recommended Posts