Create
cancel
Showing results for 
Search instead for 
Did you mean: 
Sign up Log in

Post JSON to Web API using Adaptivist Script Runner

Andrew Downs May 28, 2018

I am trying to create a post to a web API that will be used to create Active Directory users, but I cannot seem to get the formatting right. I have tried multiple searches and web links but am struggling to come across a viable option.

 

I have asked a similar question and got some response, but the issue is still present. So I have taken a different approach.

 

Basically I am reading user defined fields on a Jira SSD and trying to formulate the JSON accordingly, this is what I have so far:

 

import groovy.json.JsonSlurper;
import groovy.json.StreamingJsonBuilder;
import com.atlassian.jira.ComponentManager;
import com.atlassian.jira.issue.CustomFieldManager;
import com.atlassian.jira.issue.fields.CustomField;
import com.atlassian.jira.issue.IssueManager;
import com.atlassian.jira.component.ComponentAccessor;
import com.atlassian.jira.issue.Issue;
import com.atlassian.jira.issue.MutableIssue
import org.apache.commons.codec.binary.Base64;
import groovyx.net.http.HTTPBuilder
import static groovyx.net.http.ContentType.*
import groovyx.net.http.ContentType
import static groovyx.net.http.Method.*
import groovy.json.JsonSlurper
import net.sf.json.groovy.JsonSlurper
import groovy.json.JsonOutput

// Define Required Component Access

def customFieldManager = ComponentAccessor.getCustomFieldManager()
def issueManager = ComponentAccessor.getIssueManager()

// Get Issue ID that contains the Data
Issue issue = issueManager.getIssueObject( "SSD-18222" );

// Get field values
def fullName = customFieldManager.getCustomFieldObjectByName("Full Name");
def fullNameValue = issue.getCustomFieldValue(fullName);
//def firstName = customFieldManager.getCustomFieldObjectByName("Firstname");
//def firstNameValue = issue.getCustomFieldValue(firstName);
def firstNameValue = "Jane"
def lastName = customFieldManager.getCustomFieldObjectByName("Surname");
def lastNameValue = issue.getCustomFieldValue(lastName);
//def officeNumber = customFieldManager.getCustomFieldObjectByName("Office Number");
//def officeNumberValue = issue.getCustomFieldValue(officeNumber);
def officeNumberValue = "+27115234020"
def mobileNumber = customFieldManager.getCustomFieldObjectByName("Cell Phone Number");
def mobileNumberValue = issue.getCustomFieldValue(mobileNumber);
//def faxNumber = customFieldManager.getCustomFieldObjectByName("Office Number");
//def faxNumberValue = issue.getCustomFieldValue(faxNumber);
def title = customFieldManager.getCustomFieldObjectByName("Job Title");
def titleValue = issue.getCustomFieldValue(title);
def department = customFieldManager.getCustomFieldObjectByName("Department");
def departmentValue = issue.getCustomFieldValue(department);
def siteName = customFieldManager.getCustomFieldObjectByName("Site Code");
def siteNameValue = issue.getCustomFieldValue(siteName);
def idNumber = customFieldManager.getCustomFieldObjectByName("ID Number");
def idNumberValue = issue.getCustomFieldValue(idNumber);
//def passportNumber = customFieldManager.getCustomFieldObjectByName("Passport Number");
//def passportNumberValue = issue.getCustomFieldValue(passportNumber);
//def birthdate = customFieldManager.getCustomFieldObjectByName("Birthday");
//def birthdateValue = issue.getCustomFieldValue(birthdate);

// Define JSON

def ContainerPath = """  "LDAP://OU=BU3,OU=BU2,OU=BU1,OU=Employees,OU=contoso,DC=consto,DC=com"  """
def jsonBody = [:]
jsonBody.put("parentcontainerPath", ContainerPath)
jsonBody.put("firstName", firstNameValue)
jsonBody.put("lastName", lastNameValue)
jsonBody.put("telehpone", officeNumberValue)
jsonBody.put("mobile", officeNumberValue)
jsonBody.put("title", titleValue)
jsonBody.put("department", departmentValue)
jsonBody.put("siteName", siteNameValue)
jsonBody.put("identificationNumber", idNumberValue)
jsonBody.put("passportNumber", idNumberValue)
jsonBody.put("birthDate", "idNumberValue")

// API Post
def baseURL = "http://<server>:8090/api/Employees"
URL url = new URL(baseURL);
//URLConnection connection = url.openConnection();
HttpURLConnection connection = url.openConnection() as HttpURLConnection;
connection.requestMethod = "POST"
connection.doOutput = true
connection.setRequestProperty("Content-Type", "application/json;charset=UTF-8")
connection.outputStream
connection.outputStream.withWriter("UTF-8") { new StreamingJsonBuilder(it, jsonBody) }
connection.connect();
log.info ("URL="+url+"Status="+connection.getResponseCode() as String)

 

 If I return jsonBody I see the following:

[parentcontainerPath: "LDAP://OU=BU3,OU=BU2,OU=BU1,OU=Employees,OU=contoso,DC=contoso,DC=com" , firstName:Jane, lastName:Doe, telehpone:+27115555555, mobile:+27115555555, title:Administrator, department:Accounts, siteName:Sandton, identificationNumber:0000000000000, passportNumber:0000000000000, birthDate:idNumberValue]

 

I am trying to format the JSON as follows:

{parentcontainerPath: "LDAP://OU=BU3,OU=BU2,OU=BU1,OU=Employees,OU=contoso,DC=contoso,DC=com" , firstName:Jane, lastName:Doe, telehpone:+27115555555, mobile:+27115555555, title:Administrator, department:Accounts, siteName:Sandton, identificationNumber:0000000000000, passportNumber:0000000000000, birthDate:idNumberValue}

 

My original post is here: https://community.atlassian.com/t5/Jira-questions/Call-external-REST-API-from-workflow-transition/qaq-p/793424#U806235

I have also referenced https://my.usgs.gov/confluence/display/sciencebase/Making+POST%2C+PUT%2C+DELETE+Calls+from+Groovy and https://community.atlassian.com/t5/Answers-Developer-Questions/Making-a-REST-call-using-script-runner/qaq-p/576712

 

all without much success.

 

 

1 answer

1 accepted

Suggest an answer

Log in or Sign up to answer
0 votes
Answer accepted
Daniel Yelamos [Adaptavist]
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
May 30, 2018

Hi

Try this:

Add this import:

import groovy.json.JsonBuilder

 And this line before the comment that reads "API POST"

def finalJSON = new JsonBuilder(jsonBody).toString()).build()

That should output the JSON in the proper format.

Do say if I can help you further.

Cheers!
DYelamos

Andrew Downs May 31, 2018

Thank you for the assist. Managed to get it working. Appreciate the help.

 

I ended up getting the concatenation working as base and it posts successfully. But will look at your code as well for a more robust method I think.

Daniel Yelamos [Adaptavist]
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
May 31, 2018

Thanks:

Could you mark this answer as accepted so that other users know that this thread has been answered?

Do say if I can help you further.

Cheers
DYelamos

Vineela Durbha April 23, 2019

Hi @Andrew Downs 

I am trying to update a request using the your code

def body = [:]
body.put("IssueNumber","XCAP-688")
body.put("Priority","P4 (No Impact/Notify)")


def baseUrl = new URL("http://xxx/xxx/UpdatePriority");

HttpURLConnection connection = baseUrl.openConnection() as HttpURLConnection;
connection.requestMethod = "POST"
connection.doOutput = true
connection.setRequestProperty("Content-Type", "application/json;charset=UTF-8")
connection.outputStream
connection.outputStream.withWriter("UTF-8") { new StreamingJsonBuilder(it, body) }
connection.connect();

log.info ("URL=" +baseUrl +" Status= "+connection.getResponseCode() as String)

 

But it is throwing 500 error(whereas there is no issue with the api.Not sure why is it giving 500 error). If i am trying to pass json data as below I am getting 400 error

def body = """{"Priority": "P4 (No Impact/Notify)", "IssueNumber": "XCAP-688"}"""

 

Can you help me in passing json data

TAGS
AUG Leaders

Atlassian Community Events