Use a REST API: Difference between revisions

m
m (→‎{{header|Wren}}: Minor tidy)
 
(4 intermediate revisions by 4 users not shown)
Line 24:
<br>
Note that this version doesn't include code to submit events to Meetup.
<langsyntaxhighlight lang="go">package main
 
import (
Line 147:
fmt.Println("First event:\n", &evresp.Results[0])
}
}</langsyntaxhighlight>
{{out}}
<pre>
Line 163:
<br>
Note that this code is untested as you need a paid subscription to create events which I don't have.
<langsyntaxhighlight lang="go">package main
 
import (
Line 260:
check(err)
fmt.Printf("The %q event has been cancelled.\n", event.Name)
}</langsyntaxhighlight>
 
=={{header|Java}}==
Line 268:
EventGetter.java
 
<langsyntaxhighlight lang="java">package src;
 
import java.io.BufferedReader;
Line 326:
}
}</langsyntaxhighlight>
 
Main.java
<langsyntaxhighlight lang="java">/*
* In this class, You can see the diferent
* ways of asking for events.
Line 418:
}
 
}</langsyntaxhighlight>
 
=={{header|JavaScript}}==
Line 424:
Made on node js. Run using 'node filename.js'
 
<langsyntaxhighlight lang="javascript">var fs = require('fs');
var request = require('request');
 
Line 567:
}, function(result) {
console.log('Event: ', result);
})</langsyntaxhighlight>
 
=={{header|Phix}}==
Line 573:
Unfortunately the API (V2) does not support creating events, so instead this shows how to use
a post method to toggle sales (but see note below).
<!--<langsyntaxhighlight Phixlang="phix">(notonline)-->
<span style="color: #000080;font-style:italic;">--
-- demo\rosetta\Using_a_REST_API.exw
Line 681:
<span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">toggle_sales</span><span style="color: #0000FF;">({</span><span style="color: #008000;">"eventid"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">id</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"status"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">status</span><span style="color: #0000FF;">},</span><span style="color: #008000;">"events/togglesales"</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">print_json</span><span style="color: #0000FF;">(</span><span style="color: #008000;">""</span><span style="color: #0000FF;">,</span><span style="color: #000000;">res</span><span style="color: #0000FF;">))</span>
<!--</langsyntaxhighlight>-->
Note that toggling sales off makes the (manually created) event invisible to the API, even without
the {"status","live"} filter, hence I had to hard-code the event id to permit a second run to turn
Line 746:
 
eventGetter.py
<langsyntaxhighlight lang="python">#http://docs.python-requests.org/en/latest/
import requests
import json
Line 772:
def submitEvent(url_path,params):
r = requests.post(url_path, data=json.dumps(params))
print(r.text+" : Event Submitted")</langsyntaxhighlight>
 
main.py
<langsyntaxhighlight lang="python">import eventGetter as eg
import json
 
Line 890:
 
main()</langsyntaxhighlight>
 
=={{header|Wren}}==
{{trans|Go}}
{{libheader|WrenGo}}
{{libheader|Meetup-client(for Go)}}
{{libheader|Wren-date}}
An embedded program with a Go host and a translation of the second Go example so we can use its third party library to create events.
 
I did wonder whether it was worth the effort to do this task given that we're using a deprecated API and can't test creating events without a paid subscription which I don't have. However, from Wren's viewpoint, there are some points of interest relating to the use of WrenGo - notably passing Wren maps to Go - which may be a useful reference for the future.
<syntaxhighlight lang="wren">/* Use_a_REST_API.wren */
 
import "./date" for Date
 
class Meetup {
static groupId { "group_id" }
static groupUrlName { "group_urlname" }
static eventName { "name" }
static description { "description" }
static eventTime { "time" }
static eventUpcoming { "upcoming" }
 
foreign static getKey(fileName)
}
 
foreign class Client {
construct new(clientOpts) {}
 
groupByUrlName(urlName) { Group.new(this, urlName) }
 
eventsByGroup(urlName, status, desc) { Events.new(this, urlName, status, desc) }
 
createEvent(o) { Event.new(this, o) }
 
foreign deleteEvent(eventId)
}
 
foreign class Group {
construct new(client, urlName) {}
 
foreign urlName
foreign groupId
foreign memberCount
foreign organizerName
}
 
foreign class Event {
construct new(client, o) {}
 
foreign eventName
foreign eventId
}
 
foreign class Events {
construct new(client, urlName, status, desc) {}
 
foreign eventsCount
foreign eventsId(index)
foreign eventsName(index)
foreign eventsLink(index)
foreign venueName(index)
}
 
var keyFile = "api_key.txt"
var key = Meetup.getKey(keyFile)
var c = Client.new(key)
 
// get basic information for a particular group
var urlName = "Meetup-API-Testing"
var g = c.groupByUrlName(urlName)
System.print("Basic information for the %(g.urlName) group:")
System.print(" ID : %(g.groupId)")
System.print(" Member count : %(g.memberCount)")
System.print(" Organizer : %(g.organizerName)")
 
// get a list of upcoming events for this group
var events = c.eventsByGroup(urlName, Meetup.eventUpcoming, false)
System.print("Upcoming events for the %(g.urlName) group")
for (i in 0...events.eventsCount) {
System.print(" ID : %(events.eventsId(i))")
System.print(" Name : %(events.eventsName(i))")
System.print(" Link : %(events.eventsLink(i))")
System.print(" Venue : %(events.venueName(i))")
System.print()
}
 
// create an event for this group
var eventDate = (Date.new(2022, 4, 1, 18, 0, 0, 0, "UTC").unixTime * 1000).toString
var o = {
Meetup.groupId: g.groupId.toString,
Meetup.groupUrlName: urlName,
Meetup.eventName: "Test Meetup integration",
Meetup.description: "This is an event test.",
Meetup.eventTime: eventDate
}
 
var event = c.createEvent(o)
System.print("The ID for the %(event.eventName) event is %(event.eventId)\n")
 
// delete the event just posted
c.deleteEvent(event.eventId)
System.print("The %(event.eventName) event has been cancelled.\n")</syntaxhighlight>
<br>
We now embed this in the following Go program and build it. To run it, you will need the necessary authorization, a paid subscription and, of course, non-fictitious data.
<syntaxhighlight lang="go">/* go build Use_a_REST_API.go */
 
package main
 
import (
"github.com/Guitarbum722/meetup-client"
"github.com/Guitarbum722/meetup-client/models"
wren "github.com/crazyinfin8/WrenGo"
"io/ioutil"
"log"
"net/url"
"strings"
)
 
type any = interface{}
 
func eventOptions(et map[string][]string, vals url.Values) {
for k, v := range et {
if len(v) < 1 {
break
}
switch k {
case meetup.GroupID:
vals.Add(meetup.GroupID, strings.Join(v, ","))
case meetup.GroupURLName:
vals.Add(meetup.GroupURLName, strings.Join(v, ","))
case meetup.EventName:
vals.Add(meetup.EventName, strings.Join(v, ","))
case meetup.Description:
vals.Add(meetup.Description, strings.Join(v, ","))
case meetup.EventTime:
vals.Add(meetup.EventTime, strings.Join(v, ","))
default:
// empty
}
}
}
 
func check(err error) {
if err != nil {
log.Fatal(err)
}
}
 
func getKey(vm *wren.VM, parameters []any) (any, error) {
keyFile := parameters[1].(string)
keydata, err := ioutil.ReadFile(keyFile)
check(err)
key := strings.TrimSpace(string(keydata))
return key, nil
}
 
func newClient(vm *wren.VM, parameters []any) (any, error) {
key := parameters[1].(string)
c := meetup.NewClient(&meetup.ClientOpts{APIKey: key})
return &c, nil
}
 
func deleteEvent(vm *wren.VM, parameters []any) (any, error) {
handle := parameters[0].(*wren.ForeignHandle)
ifc, _ := handle.Get()
c := ifc.(*meetup.Clienter)
eventId := parameters[1].(string)
err := (*c).DeleteEvent(eventId)
check(err)
return nil, nil
}
 
func newGroup(vm *wren.VM, parameters []any) (any, error) {
handle := parameters[1].(*wren.ForeignHandle)
ifc, _ := handle.Get()
c := ifc.(*meetup.Clienter)
urlName := parameters[2].(string)
groups, err := (*c).GroupByURLName([]string{urlName})
check(err)
if len(groups.Groups) == 0 {
log.Fatalf("There are no groups for the url name '%s'.\n", urlName)
}
return &(groups.Groups[0]), nil
}
 
func urlName(vm *wren.VM, parameters []any) (any, error) {
handle := parameters[0].(*wren.ForeignHandle)
ifc, _ := handle.Get()
g := ifc.(**models.Group)
return (**g).URLName, nil
}
 
func groupId(vm *wren.VM, parameters []any) (any, error) {
handle := parameters[0].(*wren.ForeignHandle)
ifc, _ := handle.Get()
g := ifc.(**models.Group)
return (**g).ID, nil
}
 
func memberCount(vm *wren.VM, parameters []any) (any, error) {
handle := parameters[0].(*wren.ForeignHandle)
ifc, _ := handle.Get()
g := ifc.(**models.Group)
return (**g).MemberCount, nil
}
 
func organizerName(vm *wren.VM, parameters []any) (any, error) {
handle := parameters[0].(*wren.ForeignHandle)
ifc, _ := handle.Get()
g := ifc.(**models.Group)
return (**g).Organizer.Name, nil
}
 
func newEvent(vm *wren.VM, parameters []any) (any, error) {
handle := parameters[1].(*wren.ForeignHandle)
ifc, _ := handle.Get()
c := ifc.(*meetup.Clienter)
mhandle := parameters[2].(*wren.MapHandle)
o := make(map[string][]string)
keys := []string{
meetup.GroupID, meetup.GroupURLName, meetup.EventName,
meetup.Description, meetup.EventTime,
}
for _, key := range keys {
s, err := mhandle.Get(key)
check(err)
o[key] = []string{s.(string)}
}
event, err2 := (*c).CreateEvent(eventOptions, o)
check(err2)
return &event, nil
}
 
func eventId(vm *wren.VM, parameters []any) (any, error) {
handle := parameters[0].(*wren.ForeignHandle)
ifc, _ := handle.Get()
event := ifc.(**models.Event)
return (**event).ID, nil
}
 
func eventName(vm *wren.VM, parameters []any) (any, error) {
handle := parameters[0].(*wren.ForeignHandle)
ifc, _ := handle.Get()
event := ifc.(**models.Event)
return (**event).Name, nil
}
 
func newEvents(vm *wren.VM, parameters []any) (any, error) {
handle := parameters[1].(*wren.ForeignHandle)
ifc, _ := handle.Get()
c := ifc.(*meetup.Clienter)
urlName := parameters[2].(string)
status := parameters[3].(string)
desc := parameters[4].(bool)
events, err := (*c).EventsByGroup(urlName, []string{status}, desc)
check(err)
return &events, nil
}
 
func eventsCount(vm *wren.VM, parameters []any) (any, error) {
handle := parameters[0].(*wren.ForeignHandle)
ifc, _ := handle.Get()
events := ifc.(**models.Events)
return len((**events).Events), nil
}
 
func eventsId(vm *wren.VM, parameters []any) (any, error) {
handle := parameters[0].(*wren.ForeignHandle)
ifc, _ := handle.Get()
events := ifc.(**models.Events)
index := int(parameters[1].(float64))
return (**events).Events[index].ID, nil
}
 
func eventsName(vm *wren.VM, parameters []any) (any, error) {
handle := parameters[0].(*wren.ForeignHandle)
ifc, _ := handle.Get()
events := ifc.(**models.Events)
index := int(parameters[1].(float64))
return (**events).Events[index].Name, nil
}
 
func eventsLink(vm *wren.VM, parameters []any) (any, error) {
handle := parameters[0].(*wren.ForeignHandle)
ifc, _ := handle.Get()
events := ifc.(**models.Events)
index := int(parameters[1].(float64))
return (**events).Events[index].Link, nil
}
 
func venueName(vm *wren.VM, parameters []any) (any, error) {
handle := parameters[0].(*wren.ForeignHandle)
ifc, _ := handle.Get()
events := ifc.(**models.Events)
index := int(parameters[1].(float64))
return (**events).Events[index].Venue.Name, nil
}
 
func moduleFn(vm *wren.VM, name string) (string, bool) {
if name != "meta" && name != "random" && !strings.HasSuffix(name, ".wren") {
name += ".wren"
}
return wren.DefaultModuleLoader(vm, name)
}
 
func main() {
cfg := wren.NewConfig()
cfg.LoadModuleFn = moduleFn
vm := cfg.NewVM()
 
meetupMethodMap := wren.MethodMap{
"static getKey(_)": getKey,
}
 
clientMethodMap := wren.MethodMap{
"deleteEvent(_)": deleteEvent,
}
 
groupMethodMap := wren.MethodMap{
"urlName": urlName,
"groupId": groupId,
"memberCount": memberCount,
"organizerName": organizerName,
}
 
eventMethodMap := wren.MethodMap{
"eventId": eventId,
"eventName": eventName,
}
 
eventsMethodMap := wren.MethodMap{
"eventsCount": eventsCount,
"eventsId(_)": eventsId,
"eventsName(_)": eventsName,
"eventsLink(_)": eventsLink,
"venueName(_)": venueName,
}
 
classMap := wren.ClassMap{
"Meetup": wren.NewClass(nil, nil, meetupMethodMap),
"Client": wren.NewClass(newClient, nil, clientMethodMap),
"Group": wren.NewClass(newGroup, nil, groupMethodMap),
"Event": wren.NewClass(newEvent, nil, eventMethodMap),
"Events": wren.NewClass(newEvents, nil, eventsMethodMap),
}
 
module := wren.NewModule(classMap)
fileName := "Use_a_REST_API.wren"
vm.SetModule(fileName, module)
vm.InterpretFile(fileName)
vm.Free()
}</syntaxhighlight>
 
{{omit from|EasyLang}}
9,476

edits