Custom headers are not sent with my AJAX requests - javascript

I am trying to make an AJAX request from my client to my NodeJS/ExpressJS backend.
However, when the request is fired, my backend receive it well but doesn't recognize the custom headers . e.g.
$.ajax({
type: "POST",
url: "/foo",
headers: {"authorization": "Bearer 12345"},
data: formData,
dataType: "json",
encode: true,
})
in Node , when I do req.headers['authorization'] I get undefined.
I don't understand what I did wrong.
Any advice ?

I'm not sure whether the request you're making is cross-url or not, but if it is try the following:
$.ajax({
url: "yoururl",
type: "GET",
dataType: 'json',
xhrFields: {
withCredentials: true // edited
},
//...
});
I ran into the same error a few times before and it was due to me not adding this important attribute to the request - when authentication is required.

Related

jQuery set cookies to post method

How is it possible to set cookie to post method in jQuery ajax method?
My code is:
$.ajax({
type: "POST",
url: "https://myUrl",
data: "data",
contentType: "application/x-www-form-urlencoded",
});
I want to put there cookies but not from current session, just as String (I get it from another website), tried to add something like:
cookie: "myCookies",
but it doesn't work.
How can I solve this issue?
You cannot set the custom cookie on cross-domain requests,
try to use this code. it sets the own domain's cookies:
$.ajax({
type: "POST",
url: "URL",
data: "data",
xhrFields: {
withCredentials: true
},
contentType: "application/x-www-form-urlencoded"
});
Why You want that cookie?
You could either use sessionStorage or localStorage if you just wanna track the data in the current session.

Javascript POST to API

So I am a bit lost and hoping you can help me out. I am writing an app in simple PHP/HTML/Javascript app.
My Goal: To POST json data to an API.
How can I go about this? I just can't find any good examples to show me the best way to handle this.
In my request I need to send Basic Authorization as well as the json values.
This is what I have right now
$.ajax({
type: "POST",
url: "host.com/api/comments",
dataType: 'json',
async: false,
headers: {
"Authorization": "Basic xxxxxxxxxxxxxxxxxxxxxxx"
},
data: '{"value1":"2.0", "value2":"setPowerState", "value3":{"state":0}}',
success: function (){
alert('Comment Submitted');
}
});
I can't get the above code to work. Im using a button to call a function that will start the ajax call but nothing is happening.
Any help be be amazing! Thank You.
Use
contentType:"application/json"
You need to use JSON.stringify method to convert it to JSON format when you send it,
And the model binding will bind the json data to your class object.
The below code will work fine (tested)
$(function () {
var customer = {contact_name :"Scott",company_name:"HP"};
$.ajax({
type: "POST",
data :JSON.stringify(customer),
url: "api/Customer",
contentType: "application/json"
});
});
If you're writing the API in PHP, and it uses $_POST to get the parameters, you shouldn't send JSON. PHP only knows how to decode multipart/form-data and application/x-www-form-urlencode. If you pass an object to $.ajax, jQuery will use the urlencode format.
Just take the quotes off the object that you're passing to the data: option.
$.ajax({
type: "POST",
url: "host.com/api/comments",
dataType: 'json',
async: false,
headers: {
"Authorization": "Basic xxxxxxxxxxxxxxxxxxxxxxx"
},
data: {"value1":"2.0", "value2":"setPowerState", "value3":{"state":0}},
success: function (){
alert('Comment Submitted');
}
});
You also shouldn't use async: false, it is deprecated. Learn to write proper async code.
Nobody seems to have addressed one issue - the URL
If the page this is requested from is http://yourhost.com/path/file.html the request will be sent as http://yourhost.com/path/host.com/api/comments
As you have host.com in the URL, I assumed the request is to a different domain?
use one of
http://host.com/api/comments
https://host.com/api/comments
//host.com/api/comments
will only work if your page is loaded http and not https
will work only if the remote API supports https
will only always work properly if the remote API supports both http and https
The other issue is regarding the format of the sent data
The default content-type for $.ajax POST is application/x-www-form-urlencoded; charset=UTF-8
So, sending a POST request with various combinations of contentType and data shows the following
Firstly, without setting contentType
data: '{"value1":"2.0", "value2":"setPowerState", "value3":{"state":0}}'
request is sent as formData '{"value1":"2.0", "value2":"setPowerState", "value3":{"state":0}}'
data: {"value1":"2.0", "value2":"setPowerState", "value3":{"state":0}},
request is sent as formdata, the following values:
value1: 2.0
value2: setPowerState
value3[state]: 0
looks better, because there's actually multiple values, not just a string
Now, let's set contentType
contentType: 'json', data: {"value1":"2.0", "value2":"setPowerState", "value3":{"state":0}},
firefox does not tell me the format of the following string: 'value1=2.0&value2=setPowerState&value3%5Bstate%5D=0' - looks useless
And finally
contentType: 'json', data: '{"value1":"2.0", "value2":"setPowerState", "value3":{"state":0}}',
sends the following JSON: '{"value1":"2.0", "value2":"setPowerState", "value3":{"state":0}}'
So, finally, if the API requires JSON request data, and it's actually on a domain called "host.com"
$.ajax({
type: "POST",
url: "//host.com/api/comments",
dataType: 'json',
contentType: 'json', data: '{"value1":"2.0", "value2":"setPowerState", "value3":{"state":0}}',
});

Not able to send header with xhrfield

I am trying to get flipkart api data . like this but i am not able to send heder with xhrfield
HERE IS MY CODE :
$.ajax({
type: 'GET',
url:'https://affiliate-api.flipkart.net/affiliate/search/json?query=iPhone+mobiles&resultCount=3',
crossDomain: true,
// dataType: 'JSONP',
/*xhrFields: {
withCredentials: true
},*/
// contentType: 'application/json; charset=utf-8',
beforeSend : function(xhr) {
xhr.withCredentials = true;
xhr.setRequestHeader('Fk-Affiliate-Id', 'myid');
xhr.setRequestHeader('Fk-Affiliate-Token', 'mytoken');
},
/* headers: {
'Access-Control-Allow-Origin':'*',
'Fk-Affiliate-Id': 'myid',
'Fk-Affiliate-Token': 'mytoken',
'Content-Type': 'application/x-www-form-urlencoded'
},*/
success: function(data){ ......
}
});
As you can see comment i ahve tried both but not able to send header with xhrfield . if i comment xhrfield header wil be send
You can not send a header with a JSONP requests since all it does is set a script tag to the page.
A JSONP requests consists of appending a script tag to the page. It adds a callback parameter to the URL which the script listens for when the script is executed. There is no way to add the header to a external script.
The site would need to support JSON request for CORs to send the header.

javascript soap error calling asp.net web service

I have a working ASP.Net test web service, but I keep getting 500 errors as:
"System.InvalidOperationException: Request format is invalid: text/xml.
at System.Web.Services.Protocols.HttpServerProtocol.ReadParameters()
at System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()
"
when I call it with javascript.
It is a simple web service that takes a single parameter as a string and returns it to the client. Please help!
link to code here
For those of you who this might help, the issue was setting the SOAPAction in teh header correctly:
$.ajax({
type: "post",
url: target,
contentType: "text/xml",
data: soapBody,
dataType: "xml",
processData: false,
beforeSend: function( xhr ){
xhr.setRequestHeader(
"SOAPAction",
"http://blahblah.com/Services/MethodName"
);
},
....
Make sure that your mess variable doesn't contain GET-style query string like '?a=1&b=2'. You need to send it in POST format, for example in JSON. Try to change contentType to contentType: "application/json; charset=utf-8"
$.ajax({
url: service,
type: "POST",
dataType: "xml",
data: '{key: value}',
complete: endTest,
error: processError,
contentType: "application/json; charset=utf-8",
});

How to send json request to rails using jquery

I would like to send JSON post request to rails 3 server. I have following ajax request:
$.ajax({
type: 'POST',
contentType: "application/json",
url: url,
data: {email: "example#test.com", password: "password"},
success: onSuccess,
error: onError,
dataType: "json"
});
However the rails server receive the data as following:
{"_json"=>["object Object"]}
Where I want it to receive it as:
{"email"=>"exmaple#test.com", "password"=>"[FILTERED]"}
I think this is happening because the jquery wraps the data with _json object if the content type is json.
Does anybody know how I should do this?
This turns out to be because of bugs in old version of jquery. I now user jquery version 1.5 and send post request as follow:
$.post(url, { email: emailVal, password: passwordVal }, callback, "json").error(errorHandler);
It now works perfectly fine.
have you tried doing the serialization yourself (using jQuery.param)?
jQuery.param({email: "example#test.com", password: "password"})
==> "email=example%40test.com&password=password"
So that your ajax request becomes:
$.ajax({ type: 'POST',
contentType: "application/json",
url: url, data: $.param({email: "example#test.com", password: "password"}),
success: onSuccess,
error: onError,
dataType: "json"
});
According to jquery docs it seems like if you pass in an object to data it will try some automatic deserialization.
Set processData: false and then set data to json string.
http://api.jquery.com/jQuery.ajax/

Categories