Child pages
  • Making POST, PUT, DELETE Calls from Groovy
Skip to end of metadata
Go to start of metadata

Making POST, PUT, DELETE Calls from Groovy

POST & DELETE

Here is an example POST and DELETE (and login) using HTTPBuilder. Since it is using Grape there is no need to download the libraries. You can find out more about HTTPBuilder here: http://groovy.codehaus.org/modules/http-builder/

PUTs (updates) can also be easily done by changing the Method to put and using the full url of the item as the path.

import groovy.grape.Grape
@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.5.2')

import groovyx.net.http.*
import groovyx.net.http.ContentType.*
import groovyx.net.http.Method.*
import net.sf.json.*

def scibase
scibase = new HTTPBuilder(https://www.sciencebase.gov/catalog)
scibase.get( query: [josso_username: '<harvester username>', josso_password: '<harvester password>'] )
def newItemId

//Create a json body with all tested fields
def jsonBody = [:]
// Test title
jsonBody.put("title", "Test title")
// Test parentID
jsonBody.put("parentId", "4f5fc39de4b098845cbcb45e")


// Test Subtitle
jsonBody.put("subTitle", "subtitle")
// Test Summary
jsonBody.put("summary", "summary")
// Test Body
jsonBody.put("body", "body")
// Test purpose
jsonBody.put("purpose", "purpose")
// Test rights
jsonBody.put("rights", "rights")
// Test edition
jsonBody.put("edition", "edition")
// Test MaterialRequestInstructions
jsonBody.put("materialRequestInstructions", "materialRequestInstructions")

// Test Provenance
jsonBody.put("provenance", ["html": "provenance",
        "harvesterCode": "harvester code",
        "harvesterSourceCode": "harvester source code",
        "harvesterConfigCode": "harvester config code",
        "harvesterJob":"harvester job"])


// Test alternate titles
def alternateTitles = ["Alternate", "Titles", "For item"]
def altTitlesArray = []
alternateTitles.each{ altTitle ->
	altTitlesArray.add(altTitle.toString())
}
jsonBody.put("alternateTitles", altTitlesArray)

// Test narratives
def narratives = [[type: "type", content: "content"],[type: "type2", content: "content2"]]
def narrativeArray = []
narratives.each{ narrative ->
	narrativeArray.add(["type": narrative.type.toString(), "content": narrative.content.toString()])
}
jsonBody.put("narratives", narrativeArray)

// Test identifers
def identifiers = [[scheme: "scheme", type: "type", key: "key"],[scheme: "scheme2", type: "type2", key: "key2"]]
def identifierArray = []
identifiers.each{ identifier ->
	identifierArray.add(["scheme": identifier.scheme.toString(),
						 "type": identifier.type.toString(),
						 "key": identifier.key.toString()])

}
jsonBody.put("identifiers", identifierArray)

// Test tags
def tags = ["Tag1", "Tag2"]
def tagsArray = []
tags.eachWithIndex{ tag, i ->
	tagsArray.add(["name": tag.toString()])
}
jsonBody.put("tags", tagsArray)

// Test Contacts
def contacts = [[type: "Data Owner", name: "Data Owner"], [type: "Project Leader", name: "Project Leader"]]
def contactsArray = []
contacts.each { contact ->
	contactsArray.add(["type": contact.type, "name": contact.name])
}
jsonBody.put("contacts", contactsArray)

// Test tableOfContents
jsonBody.put("tableOfContents", "table of contents")


/* Put more fields here */



// POST
scibase.request(Method.POST, ContentType.JSON){ req ->
	uri.path = "/catalog/item/"
	uri.query = [format:'json']
	body = jsonBody

	response.success = { resp, json ->
		assert resp.status == 200
		newItemId = json.id
	}
	// not logged in response
	response.'302' = { resp ->
		throw new Exception("Stopping at item POST: uri: " + uri + "\n" +
			"   You are not logging in properly. Item will not be created.")
	}
	response.failure = { resp, json ->
		throw new Exception("Stopping at item POST: uri: " + uri + "\n" +
			"   Unknown error trying to create item: ${resp.status}, not creating Item." +
            "\njson = ${json}")
	}
}

println "New item Id = " + newItemId

System.console().readLine "Press enter when ready to delete item"

scibase.request(Method.DELETE){ req ->
	uri.path = "/catalog/item/" + newItemId
	uri.query = [format:'json']

	// Item exists, change POST to PUT
	response.success = { resp, json ->
		println "SUCCESS: Successfully deleted item '${newItemId}'"
	}
	response.failure = { resp ->
		throw new Exception("FAILURE: Could not delete item '${newItemId}'. Error response: \n${resp.statusLine}")
	}
}
  • No labels