0

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

aacg
  • 3
  • 4

1 Answers1

0

Ok, the desired format expected by the server is "key=value&key=value" therefore the Json object I tried to send was not working.

Here is how I am creating the string,

            var _nameValueLst = (from data in owner.GetType().GetProperties() select new { name = data.Name, value = data.GetValue(owner, null) }).ToList();
            NameValueCollection _myCollection = new NameValueCollection();

            foreach (var item in _nameValueLst)
            {
                _myCollection.Add(item.name, item.value.ToString());
            }

            string _request = ToQueryString(_myCollection);

From How to build a query string for a URL in C#?

    private static string ToQueryString(NameValueCollection nvc)
    {
        var array = (from key in nvc.AllKeys
                     from value in nvc.GetValues(key)
                     select string.Format("{0}={1}", HttpUtility.UrlEncode(key), HttpUtility.UrlEncode(value)))
            .ToArray();
        return "?" + string.Join("&", array);
    }
aacg
  • 3
  • 4