Patrioticcow
Patrioticcow

Reputation: 27038

jQuery posting JSON

update: I would like to pass the var value to the server

hello, same old, same old ... :)

I have a form called <form id="testForm" action="javascript:test()"> and a code area called <code id="testArea"></code>

I am using this code to stringify and display the data in the code area:

var formData = form2object('testForm');
document.getElementById('testArea').innerHTML = JSON.stringify(formData, null, '\t');
var value = JSON.stringify(formData, null, '\t');

What I want is to send this data to a JSON file. I've been working on this project : http://ridegrab.com/profile_old/ and if you press Submit Query button you will see the head of the page populate.

Also I want use this piece of script to send data:

    function authenticate(userName, password) {
    $.ajax
    ({
        type: "POST",
        //the url where you want to sent the userName and password to
        url: 'username:password@link to the server/update',
        dataType: 'json',
        async: false,
        //json object to sent to the authentication url
        data: '{"userName": "' + userName + '", "password" : "' + password + '"}',
        success: function () {

        alert("Thanks!"); 
        }
    })
}

Again, all I want is to be able to send that JSON data to the server. My server is set up to update or POST the data in the right place.

Upvotes: 221

Views: 437717

Answers (4)

Jan Tungli
Jan Tungli

Reputation: 47

Post async function with event.

//---------------------Buffers <0-9>--------------------- 
var gBuffer=[];

function GetBuffer(pIndex=0) {
    if (pIndex<0 || pIndex>9) {
        console.log('Error, pIndex out of interval <0,9>');
        return null;
    }
    if (gBuffer.length<10) {gBuffer.length=10;}
    return gBuffer[pIndex];
}

function SetBuffer(pIndex=0, pJson="") {
    if (pIndex>=10 || pIndex<0) { 
        console.log('Error, pIndex out of interval <0,9>');
        return null;
    } 
    if (gBuffer.length<10) {gBuffer.length=10;}
    return gBuffer[pIndex]=pJson;
}

//---------------------Post and generate event--------------------- 

function sleep(ms=3) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

async function gWait(pIndex=0, pTimeoutSec=10, pEventTag="html", pEventName="PostEvent" ) {  // async, generate event 
    if (pIndex<0 || pIndex>9) {
        console.log('Error, pIndex out of interval <0,9>');
        return;
    }
    var i=0;
    console.log('gWait start');
    while (i < 25*pTimeoutSec && GetBuffer(pIndex)==null) {
      await sleep(40);
      i++;
    }
    if (i>=25*pTimeoutSec)  {
      SetBuffer(pIndex,'{"error":"SRV error. Fetch timeout ('+pTimeoutSec+' sec)"}');
    }
    console.log('gWait stop, iteration:'+i+'/'+25*pTimeoutSec);
    $(pEventTag).trigger(pEventName,pIndex); //generate event
}

async function Post(pJSON="", pIndex=0, pTimeoutSec=10, pEventTag="html", pEventName="PostEvent") { //send JSON and return response to gArray[pIndex]
    if (pIndex<0 || pIndex>9) {
        console.log('Error, pIndex out of interval <0,9>');
        return;
    }
    var js=Trim(pJSON);
    if (js=="") { js="{}"; } //empty JSON   
    SetBuffer(pIndex,null);
    try {
        if (pTimeoutSec>0) {gWait(pIndex,pTimeoutSec,pEventTag,pEventName);} //timeout controll, and generate event
        var resp=await fetch("ajax",   //url to server example: "http://localhost:8081/api/services/tags/"
        {   method: "POST",
            headers: {"Content-Type": "application/json; charset=utf-8" },
            body: js,
            async: true,
        })
        if (resp.status==200) {
            const result= await resp.json();
            SetBuffer(pIndex,JSON.stringify(result));
        } else {
            SetBuffer(pIndex,'{"error":"SRV error. '+resp.status+'"}');   
        }
    }
    catch (err) {
       SetBuffer(pIndex,'{"error":"SRV error. Failed to fetch."}');
    }  
    if (pTimeoutSec<=0) { $(pEventTag).trigger(pEventName,pIndex);} //generate event
}

$(document).ready(function(){
   alert('ok');
   $("html").on("PostEvent", function(event,msg){ 
      console.log(event.type+' gBuffer['+msg+']:'+GetBuffer(msg));
   });
   
   $("form").submit(function (event) {
       event.preventDefault();
       Post('{"hello":""}');  //JSON post
       event.preventDefault();
    });
});
    

Upvotes: -2

Kyle Wild
Kyle Wild

Reputation: 8915

'data' should be a stringified JavaScript object:

data: JSON.stringify({ "userName": userName, "password" : password })

To send your formData, pass it to stringify:

data: JSON.stringify(formData)

Some servers also require the application/json content type header:

contentType: 'application/json'

There's also a more detailed answer to a similar question here: Jquery Ajax Posting JSON to webservice

Upvotes: 252

nizam.sp
nizam.sp

Reputation: 4062

In case you are sending this post request to a cross domain, you should check out this link.

https://stackoverflow.com/a/1320708/969984

Your server is not accepting the cross site post request. So the server configuration needs to be changed to allow cross site requests.

Upvotes: 2

teknopaul
teknopaul

Reputation: 6762

You post JSON like this

$.ajax(url, {
    data : JSON.stringify(myJSObject),
    contentType : 'application/json',
    type : 'POST',
    ...

if you pass an object as settings.data jQuery will convert it to query parameters and by default send with the data type application/x-www-form-urlencoded; charset=UTF-8, probably not what you want

Upvotes: 296

Related Questions