I am not familiar with JavaScript and i am trying to mimic the following ajax POST in C# (OWNER option from http://api-examples.petexec.net/)
var baseUrl = 'https://beta.petexec.net/api';
var access_token = '';//Your access token @see: https://beta.petexec.net/api/apidoc/index.html#api-Authenticate-GetToken
$('#submitButton').on('click', addOwner);
function addOwner(e) {
e.preventDefault();
var formData = $('#addOwnerForm').serializeArray();
$.ajax({
type : 'POST',
url : baseUrl + '/owner/',
dataType : 'json',
data : formData,
headers : {
'Authorization' : 'Bearer ' + access_token
},
success : successCallback,
error : errorCallback
});
}
function successCallback(data, textStatus, jqXHR) {
$('#result').html(textStatus + '<br/>' + JSON.stringify(data));
}
function errorCallback(jqXHR, textStatus, errorThrown) {
$('#result').html(JSON.stringify(jqXHR.responseJSON));
}
$("#select_all").change(function() {
$("input:checkbox").prop('checked', $(this).prop("checked"));
});
The JSON.stringify is not applied to "formData", so I am not sure what the server is expecting to receive.
Also, since there are no ContentType it seems like the ContentType is application/x-www-form-urlencoded; charset=UTF-8.
I have tried to generate the data in C# in different formats and have not being able to successfully execute the request.
If i try the ajax call it executes successfully. Below is part of the c# code,
public static string AddOwner(AuthenticateResponseModel authenticateData, OwnerModel owner, string json)
{
string _methodName = MethodBase.GetCurrentMethod().DeclaringType + "-" + MethodBase.GetCurrentMethod().Name;
string _retVal = string.Empty;
// Related to HTTP objects.
WebRequest _restRequest;
WebResponse _restResponse;
// Related to JSON serialization
//JavaScriptSerializer _jsonSerializer = new JavaScriptSerializer();
// Authenticate and retrieve the session token.
try
{
//byte[] _encbuff = System.Text.Encoding.UTF8.GetBytes(Constants.CLIENT_ID + ":" + Constants.CLIENT_SECRET);
//string _encbase = Convert.ToBase64String(_encbuff);
string _request = string.Format("{{\"username\":\"{0}\",\"password\":\"{1}\",\"password2\":\"{2}\",\"firstname\":\"{3}\",\"lastName\":\"{4}\"" +
",\"employer\":\"{5}\",\"addr1\":\"{6}\",\"addr2\":\"{7}\",\"city\":\"{8}\",\"state\":\"{9}\",\"zip\":\"{10}\",\"email\":\"{11}\"" +
",\"homePhone\":\"{12}\",\"cellPhone\":\"{13}\",\"workPhone\":\"{14}\",\"emergencyContact\":\"{15}\",\"emergencyPhone\":\"{16}\",\"emergencyEmail\":\"{17}\",\"howFoundId\":\"{18}\"" +
",\"howFoundOther\":\"{19}\",\"additionalOwner\":\"{20}\",\"birthdayEmail\":\"{21}\",\"boardingEmail\":\"{22}\",\"boardingReminderEmail\":\"{23}\",\"daycarePackageEmail\":\"{24}\",\"enableEmail\":\"{25}\"" +
",\"groomingEmail\":\"{26}\",\"newOwnerEmail\":\"{27}\",\"orderReceiptEmail\":\"{28}\",\"scheduledServiceEmail\":\"{29}\",\"trainingClassEmail\":\"{30}\",\"temptestEmail\":\"{31}\",\"vaccinationEmail\":\"{32}\"" +
",\"cardName\":\"{33}\",\"cardHolder\":\"{34}\",\"cardNum\":\"{35}\",\"expMonth\":\"{36}\",\"expYear\":\"{37}\",\"billingName\":\"{38}\",\"billingAddr1\":\"{39}\"" +
",\"billingAddr2\":\"{40}\",\"billingCity\":\"{41}\",\"billingState\":\"{42}\",\"billingZip\":\"{43}\",\"isPrimary\":\"{44}\"}}",
//string _request = string.Format("[{{\"name\":\"username\", \"value\":\"{0}\"}},{{\"name\":\"password\",\"value\":\"{1}\"}},{{\"name\":\"password2\",\"value\":\"{2}\"}},{{\"name\":\"firstName\",\"value:\":\"{3}\"}},{{\"name\":\"lastName\",\"value\":\"{4}\"}}" +
// ",{{\"name\":\"employer\", \"value\":\"{5}\"}},{{\"name\":\"addr1\",\"value\":\"{6}\"}},{{\"name\":\"addr2\",\"value\":\"{7}\"}},{{\"name\":\"city\",\"value:\":\"{8}\"}},{{\"name\":\"state\",\"value:\":\"{9}\"}},{{\"name\":\"zip\",\"value\":\"{10}\"}},{{\"name\":\"email\", \"value\":\"{11}\"}}" +
// ",{{\"name\":\"homePhone\", \"value\":\"{12}\"}},{{\"name\":\"cellPhone\",\"value\":\"{13}\"}},{{\"name\":\"workPhone\",\"value\":\"{14}\"}},{{\"name\":\"emergencyContact\",\"value:\":\"{15}\"}},{{\"name\":\"emergencyPhone\",\"value:\":\"{16}\"}},{{\"name\":\"emergencyEmail\",\"value\":\"{17}\"}},{{\"name\":\"howFoundID\",\"value\":\"{18}\"}}" +
// ",{{\"name\":\"howFoundOther\", \"value\":\"{19}\"}},{{\"name\":\"additionalOwner\",\"value\":\"{20}\"}},{{\"name\":\"birthdayEmail\",\"value\":\"{21}\"}},{{\"name\":\"boardingEmail\",\"value:\":\"{22}\"}},{{\"name\":\"boardingReminderEmail\",\"value:\":\"{23}\"}},{{\"name\":\"daycarePackageEmail\",\"value\":\"{24}\"}},{{\"name\":\"enableEmail\",\"value\":\"{25}\"}}" +
// ",{{\"name\":\"groomingEmail\", \"value\":\"{26}\"}},{{\"name\":\"newOwnerEmail\",\"value\":\"{27}\"}},{{\"name\":\"orderReceiptEmail\",\"value\":\"{28}\"}},{{\"name\":\"scheduledServiceEmail\",\"value:\":\"{29}\"}},{{\"name\":\"trainingClassEmail\",\"value:\":\"{30}\"}},{{\"name\":\"temptestEmail\",\"value\":\"{31}\"}},{{\"name\":\"vaccinationEmail\",\"value\":\"{32}\"}}" +
// ",{{\"name\":\"cardName\", \"value\":\"{33}\"}},{{\"name\":\"cardHolder\",\"value\":\"{34}\"}},{{\"name\":\"cardNum\",\"value\":\"{35}\"}},{{\"name\":\"expMonth\",\"value:\":\"{36}\"}},{{\"name\":\"expYear\",\"value:\":\"{37}\"}},{{\"name\":\"billingName\",\"value\":\"{38}\"}},{{\"name\":\"billingAddr1\",\"value\":\"{39}\"}}" +
// ",{{\"name\":\"billingAddr2\", \"value\":\"{40}\"}},{{\"name\":\"billingCity\",\"value\":\"{41}\"}},{{\"name\":\"billingState\",\"value\":\"{42}\"}},{{\"name\":\"billingZip\",\"value:\":\"{43}\"}},{{\"name\":\"isPrimary\",\"value:\":\"{44}\"}}]",
//string _request = json;
owner.username, owner.password, owner.password2, owner.firstName, owner.lastName,
owner.employer, owner.addr1, owner.addr2, owner.city, owner.state, owner.zip, owner.email,
owner.homePhone, owner.cellPhone, owner.workPhone, owner.emergencyContact, owner.emergencyPhone, owner.emergencyEmail, owner.howFoundID,
owner.howFoundOther, owner.additionalOwner, owner.birthdayEmail, owner.boardingEmail, owner.boardingReminderEmail, owner.daycarePackageEmail, owner.enableEmail,
owner.groomingEmail, owner.newOwnerEmail, owner.orderReceiptEmail, owner.scheduledServiceEmail, owner.trainingClassEmail, owner.temptestEmail, owner.vaccinationEmail,
owner.cardName, owner.cardHolder, owner.cardNum, owner.expMonth, owner.expYear, owner.billingName, owner.billingAddr1,
owner.billingAddr2, owner.billingCity, owner.billingState, owner.billingZip, owner.isPrimary); // Parameters for the request.
string _uri = Constants.BASE_URI + "/owner/";
_restRequest = WebRequest.Create(_uri); // Set the URI for the request to be made.
_restRequest.Method = Constants.VERB_METHOD_POST; // Set the http verb.
_restRequest.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"; // Constants.JSON_CONTENT_TYPE; // Set the content type.
_restRequest.Headers[Constants.HTTP_SESSION_TOKEN_HEADER] = "Bearer " + authenticateData.access_token;
//CustomLog(_methodName, "Request to be sent for username, " + username);
using (Stream requestStream = _restRequest.GetRequestStream())
{
byte[] inputStringBytes = Encoding.UTF8.GetBytes(_request);
requestStream.Write(inputStringBytes, 0, inputStringBytes.Length);
}
//CustomLog(_methodName, "Request sent");
using (_restResponse = _restRequest.GetResponse())
{
// Get the response stream.
using (Stream _responseStream = _restResponse.GetResponseStream())
{
// Read the response stream from the httpheader.
StreamReader _rdr = new StreamReader(_responseStream, Encoding.UTF8);
string _rawJsonAddOwnerResponse = _rdr.ReadToEnd();
// verify that it returned a result.
if (string.IsNullOrEmpty(_rawJsonAddOwnerResponse))
throw new Exception("Session token was not created. No result returned from request to logon. username: " + owner.username + " userEmail = " + owner.email);
AddOwnerResponse _authResponse = JsonConvert.DeserializeObject<AddOwnerResponse>(_rawJsonAddOwnerResponse);
// verify that the result isn’t empty.
if (_authResponse.success == "false")
throw new Exception("Unable to create owner. username: " + owner.username + " userEmail = " + owner.email);
// Check if request was successfully responded.
HttpWebResponse _response = (HttpWebResponse)_restResponse;
if (_response.StatusCode == HttpStatusCode.OK)
{
//CustomLog(_methodName, "Owner with username: " + owner.username + ", userEmail = " + owner.email + " was successfully created. Session token: " + authenticateData.access_token + " message: " + authenticateData.message);
}
else
{
//CustomLog(_methodName, "Owner with username: " + owner.username + ", userEmail = " + owner.email + " was not created. Session token: " + authenticateData.access_token + " message: " + authenticateData.message);
}
}
}
//CustomLog(_methodName, "Response received");
}
catch (WebException ex)
{
//CustomLog(_methodName, "Exception: " + ex.Message);
}
return _retVal;
}
I have also tried to JsonConvert.SerializeObject(owner); and create a list of NameValue custom type and serializing as well, List _nameValueLst = new List();
_nameValueLst.Add(new NameValue()
{
name = "username",
value = owner.username
});
_nameValueLst.Add(new NameValue()
{
name = "password",
value = owner.password
});
_nameValueLst.Add(new NameValue()
{
name = "password2",
value = owner.password2
});
_nameValueLst.Add(new NameValue()
{
name = "firstName",
value = owner.firstName
});
_nameValueLst.Add(new NameValue()
{
name = "lastName",
value = owner.lastName
});
_nameValueLst.Add(new NameValue()
{
name = "employer",
value = owner.employer
});
_nameValueLst.Add(new NameValue()
{
name = "addr1",
value = owner.addr1
});
_nameValueLst.Add(new NameValue()
{
name = "addr2",
value = owner.addr2
});
_nameValueLst.Add(new NameValue()
{
name = "city",
value = owner.city
});
_nameValueLst.Add(new NameValue()
{
name = "state",
value = owner.state
});
_nameValueLst.Add(new NameValue()
{
name = "zip",
value = owner.zip.ToString()
});
_nameValueLst.Add(new NameValue()
{
name = "email",
value = owner.email
});
_nameValueLst.Add(new NameValue()
{
name = "homePhone",
value = owner.homePhone
});
_nameValueLst.Add(new NameValue()
{
name = "cellPhone",
value = owner.cellPhone
});
_nameValueLst.Add(new NameValue()
{
name = "workPhone",
value = owner.workPhone
});
_nameValueLst.Add(new NameValue()
{
name = "emergencyContact",
value = owner.emergencyContact
});
_nameValueLst.Add(new NameValue()
{
name = "emergencyPhone",
value = owner.emergencyPhone
});
_nameValueLst.Add(new NameValue()
{
name = "emergencyEmail",
value = owner.emergencyEmail
});
_nameValueLst.Add(new NameValue()
{
name = "howFoundId",
value = owner.howFoundID.ToString()
});
_nameValueLst.Add(new NameValue()
{
name = "howFoundOther",
value = owner.howFoundOther
});
_nameValueLst.Add(new NameValue()
{
name = "additionalOwner",
value = owner.additionalOwner
});
_nameValueLst.Add(new NameValue()
{
name = "birthdayEmail",
value = owner.birthdayEmail.ToString()
});
_nameValueLst.Add(new NameValue()
{
name = "boardingEmail",
value = owner.boardingEmail.ToString()
});
_nameValueLst.Add(new NameValue()
{
name = "boardingReminderEmail",
value = owner.boardingReminderEmail.ToString()
});
_nameValueLst.Add(new NameValue()
{
name = "daycarePackageEmail",
value = owner.daycarePackageEmail.ToString()
});
_nameValueLst.Add(new NameValue()
{
name = "enableEmail",
value = owner.enableEmail.ToString()
});
_nameValueLst.Add(new NameValue()
{
name = "groomingEmail",
value = owner.groomingEmail.ToString()
});
_nameValueLst.Add(new NameValue()
{
name = "newOwnerEmail",
value = owner.newOwnerEmail.ToString()
});
_nameValueLst.Add(new NameValue()
{
name = "orderReceiptEmail",
value = owner.orderReceiptEmail.ToString()
});
_nameValueLst.Add(new NameValue()
{
name = "scheduledServiceEmail",
value = owner.scheduledServiceEmail.ToString()
});
_nameValueLst.Add(new NameValue()
{
name = "trainingClassEmail",
value = owner.trainingClassEmail.ToString()
});
_nameValueLst.Add(new NameValue()
{
name = "temptestEmail",
value = owner.temptestEmail.ToString()
});
_nameValueLst.Add(new NameValue()
{
name = "vaccinationEmail",
value = owner.vaccinationEmail.ToString()
});
_nameValueLst.Add(new NameValue()
{
name = "cardName",
value = owner.cardName.ToString()
});
_nameValueLst.Add(new NameValue()
{
name = "cardHolder",
value = owner.cardHolder.ToString()
});
_nameValueLst.Add(new NameValue()
{
name = "cardNum",
value = owner.cardNum.ToString()
});
_nameValueLst.Add(new NameValue()
{
name = "expMonth",
value = owner.expMonth.ToString()
});
_nameValueLst.Add(new NameValue()
{
name = "expYear",
value = owner.expYear.ToString()
});
_nameValueLst.Add(new NameValue()
{
name = "billingName",
value = owner.billingName.ToString()
});
_nameValueLst.Add(new NameValue()
{
name = "billingAddr1",
value = owner.billingAddr1.ToString()
});
_nameValueLst.Add(new NameValue()
{
name = "billingAddr2",
value = owner.billingAddr2.ToString()
});
_nameValueLst.Add(new NameValue()
{
name = "billingCity",
value = owner.billingCity.ToString()
});
_nameValueLst.Add(new NameValue()
{
name = "billingState",
value = owner.billingState.ToString()
});
_nameValueLst.Add(new NameValue()
{
name = "billingZip",
value = owner.billingZip.ToString()
});
_nameValueLst.Add(new NameValue()
{
name = "isPrimary",
value = owner.isPrimary.ToString()
});
string _request = JsonConvert.SerializeObject(_nameValueLst);
The response I get is,
{"success":false,"errors":["Please enter a first name.","Please enter a last name.","Please enter an address.","Please enter a city name.","Please enter a state.","Please enter a ZIP code.","Please enter a cell number for the owner.","Please enter an emergency contact.","Please enter the emergency contact phone number.","Please enter a valid email address."]}
I am clearly passing these values and their casing matches that of the online documentation (adding owner), https://secure.petexec.net/api/apidoc/index.html#api-Authorization-AuthorizationToken
I believe the data is being passed incorrectly and it is not being recognized.
Does anybody knows what is the correct way to mimic that ajax POST request?
Thank you