What I'm doing is returning an RSS feed obtained via a PHP cURL. I return $returnedData which is an associative array that looks something like this:
array(2){
["lastupdate"] => string(29) "Tue, 11 Feb 2014 15:25:42 GMT"
["feed"] => array(20) {
<items contained within ["feed"][0] to ["feed"][19] (very large)>
}
}
I tried to run a json_encode before returning it to Ajax, but all it essentially did was convert my array into one large string. My Ajax is as follows:
$.ajaxSetup ({
cache: false
});
request = $.ajax ({
type: "GET",
url: "dataFetcher.php",
data: arg,
});
request.done(function(response){
var resultsArray = response;
$("#message").text(resultsArray);
});
request.fail(function (jqXHR, textStatus, errorThrown){
// log the error to the console
console.error(
"The following error occured: "+
textStatus, errorThrown
);
});
The thing is, I don't exactly know what I'm getting. If I do var_dump($returnedData) instead of return $returnedData I know that I get a string. But if I simply return $returnedData, I can't tell what Ajax is receiving. I tried changing the text displayed by using resultsArray[0] or resultsArray[1] or resultsArray["lastupdate"] hoping that it worked, but it didn't.
Would really appreciate it if someone could shed some light on what I'm not doing/what I'm doing wrong here.
Thanks!
AJAX receives the response sent by the server. I'm not a PHP programmer, but from what I've picked up reading other SO questions, you'd need to do something like:
echo json_encode($returnedData)
in your PHP script. The echo means that it's part of the output, and json_encode converts your PHP array into a JSON string, which represents the array in a way that JavaScript actually understands.
Depending on the headers of the response set in your PHP jQuery may or may not automatically parse the string as JSON, passing the resulting object/array to the success handler (as the value of the first argument) rather than just passing along the string response. You can tell it to do that (if you know the response will/should be JSON) by setting the dataType property in your $.ajax() call:
request = $.ajax ({
type: "GET",
url: "dataFetcher.php",
data: arg,
dataType: 'json'
});
Then inside your done handler function response would be the JavaScript object that matches your PHP array.
Two things:
Use json_encode in your PHP script to encode the data.
jQuery is interpreting the response as a string. You can either parse the response string as JSON, or you can take the easier route of setting the AJAX request to expect JSON.
So:
request = $.ajax ({
type: "GET",
url: "dataFetcher.php",
data: arg,
dataType: 'json' // <--- Your response parameter will be in JSON format by default, now.
});
You need to eval your response to javascript object
request.done(function(response){
var resultsArray = response.evalJSON();
$("#message").text(resultsArray);
});
or inside ajax call define that you will receive json
request = $.ajax ({
type: "GET",
url: "dataFetcher.php",
data: arg,
dataType: 'json'
});
Related
I need to save a json object to a file.
Therefore I'm using another PHP script which writes the data to a file. Data and filename are sent by an ajax POST request.
var results = $('results');
var filename = $('#filename').val();
$.ajax({
url: 'jsonWriter.php',
type: 'POST',
contentType: "application/json; charset=utf-8",
dataType: "json",
data: JSON.stringify([{data: data, filename: filename }]),
success: function(data) {
results.html(data);
},
error: function(jqXhr, textStatus, error) {
results.html("<p class=\"error\">ERROR: " + textStatus + ", " + error + "</p>");
}
});
When I monitor the request in Fiddler, it looks fine and the posted data is correct.
However, somehow the error function is invoked. It outputs
ERROR: parsererror, SyntaxError: JSON.parse: unexpected non-whitespace character after JSON data
I copied the posted JSON data from Fiddler into different online parsers, which ensured it is valid.
Why is the error function invoked anyway?
It looks to me like you are expecting the server to return text content, since you are applying it with .html:
success: function(data) {
results.html(data);
},
However, you are telling jQuery to expect JSON data:
dataType: "json",
jQuery is therefore attempting to parse your content returned from the server as JSON and failing. You need to change dataType to either text or html.
This is my jQuery code
function ajaxCall(dataStream) {
$.ajax({
type: 'post',
url: 'be/email.php',
data: JSON.stringify(dataStream),
contentType: "application/json; charset=utf-8",
traditional: true,
success: function (data) {
}
});
The dataStream is { email: "da#gt.lo", skype: "dasd"}.
Is this correct way of sending a json to PHP. I can see the json being sent in dev tools. But i cannot get them from my php.
Change it as below:
data: {ds: JSON.stringify(dataStream) },
Then on PHP, you can get it by $_POST['ds']
Basically, data should be sent as key: value pairs
By using JSON.stringify, you are actually converting your Javascript object to a String.
Thus, it will send a string to your PHP script, and you will need to json_decode() it to retrieve values.
You should rather use:
data: dataStream
to send an array of values, and retrieve them with $_POST['email'] and $_POST['skype'] in your PHP script.
I'm using jquery ajax function.
I noticed an issue when I post JSON data to the server.
The type of post data is JSON. So I added the code to specify what I sent was JSON.
contentType: "application/json".
I wrote below code:
var data = {"data": "mytestdata" };
var option = {
url: 'Handler1.ashx',
type: 'POST',
dataType: 'html',
success: function (result) {
alert(result);
},
data: data,
contentType: "application/json"
};
$.ajax(option);
At the server side, I used below code:
string s = context.Request["data"];
But the result s was null.
Logically,setting contentType="application/json" and posting json data are perfect. But it's false.
Also I tried code in php file:
echo $_POST["data"];
PHP says $_POST["data"] doesn't exist.
So I tried to remove the code -- contentType: "application/json".
Now,everything is OK.
But it confused me.
Why needn't set contentType as json when we post the real json data?
You don't need to do contentType: "application/json", when you don't specify content type, it converts the data to be sent in http params, from the json..which are accessible via $_GET, or $_POST params..
But if you want to send json data only..you can try this code on server side to get the data:
<?php
$data = #file_get_contents('php://input');
print_r(json_decode($data));
?>
You were not sending JSON data back. jQuery considers it an error when the ajax content type is set to accept JSON, but malformed JSON is sent back.
echo $_POST['data'] will likely throw the exception "Catchable fatal error: Object of class stdClass could not be converted to string" -- so that actually gets printed out. That's not valid JSON.
What you probably want to do is echo json_encode($_POST['data']);
I'm trying to post data via ajax, this is my info:
var jsondata =
{"address" : [
{ "id": addid, "streetaddress": streetaddress, "city": city, "state": state, "zipcode": zipcode, "latitude": latitude},
]
};
var jsontosend = JSON.stringify(jsondata, null, 2);
ajax function:
$.ajax({
type: "POST",
url: "process.php",
contentType: "application/json; charset=utf-8",
dataType: "JSON",
data: jsontosend,
success: function(msg){
alert(msg);
}
});
return false;
alert('Data sent');
}
on the php end, when i print_r($_POST) it just says
array(0) {
}
I'm alerting (jsontosend) and its showing me everything perfectly, as well as in firebug using post mothod, its showing all the params sent in a perfect clean manner.
The only way it passes any data is if I use GET method.
Any advice is greatly appreciated!
EDIT: adding POST data from firebug.
this is whats being alerted from the alert function:
{"address":[{"id":1473294,"streetaddress":"3784 Howard Ave","city":"Washington DC","state":"DC","zipcode":20895,"latitude":39.027820587}]}
this is what firebug is showing as whats being passed when using POST method:
myData=%7B%0A++++%22address%22%3A+%5B%0A++++++++%7B%0A++++++++++++%22id%22%3A+76076%2C%0A++++++++++++%22streetaddress%22%3A+%223784+Howard+Ave%22%2C%0A++++++++++++%22city%22%3A+%22Washington+DC%22%2C%0A++++++++++++%22state%22%3A+%22DC%22%2C%0A++++++++++++%22zipcode%22%3A+20895%2C%0A++++++++++++%22latitude%22%3A+39.027820587%0A++++++++%7D%0A++++%5D%0A%7D
and this is the response for var_dump of $_POST:
array(0) {
}
this is a var_dump of $_POST['myData']
NULL
I'm skeptical of the way you're using the contentType property. Try taking out contentType. The default content type is
application/x-www-form-urlencoded (http://api.jquery.com/jQuery.ajax/).
Also, use something like {mydata: jsontosend} for your data property.
$.ajax({
type: "POST",
url: "process.php",
//contentType: "application/json; charset=utf-8",
dataType: "JSON",
data: {mydata: jsontosend},
success: function(msg){
alert(msg);
}
});
Use
data:{myData: jsontosend}
It should send myData as a parameter in your request.
PHP doesn't understand application/json requests (by default).
See this question: How to post JSON to PHP with curl
I found that the comment provided by dkulkarni was the best solution here. It is necessary to read directly from the input stream to get POST data of any complexity. Changing the value of $.ajax({contentType: ''}) did not work for me..
In order to troubleshoot this problem I had set up a controller method to echo back the JSON I was posting to my server. Changing the ContentType header made no difference.
But after reading dkulkarni's comment I changed my server code from this:
return $_POST;
to this:
$data = file_get_contents('php://input');
return json_decode($data);
It worked perfectly.
As dkulkarni commented in his post (Jan 24 at 7:53), the only way to retrieve JSON sent with Content-Type application/json seems to be to retrieve it directly from the input stream.
I made a lot of tests with different approaches, but always when I set Content-Type to JSON, the $_POST in PHP is empty.
My problem is I need to set Content-Type to JSON, because the server (where I don't have access) expects it, otherwise it returns unsupported datatype. I suppose they are retrieving directly from input stream.
Why I have to reproduce that in own PHP file? Because I need to make a proxy for testing issues, but thats not the point of this thread.
Taking contentType out is not a good idea. You DO want to send this data in JSON format. Key is to do what has been mentioned above, instead of trying to access the data on the receiving end (the target php file) with $data= $_POST it is critical to use $data = file_get_contents('php://input');
Here is an example of the entire round trip for a scenario with php and knockout.js:
JS (on requesting page):
function() {
var payload = ko.toJSON({ YOUR KNOCKOUT OBJECT });
jQuery.ajax({
url: 'target.php',
type: "POST",
data: payload,
datatype: "json",
processData: false,
contentType: "application/json; charset=utf-8",
success: function (result) {
alert(result);
}
});
};
And then in target.php (the page receiving the request):
$data = file_get_contents('php://input');
$payload_jsonDecoded = json_decode($data
Try removing ' dataType: "JSON" ' from the ajax request and check.
I'm sending a JSON object to PHP using jQuery via
$.ajax({
url: myURL,
type: 'POST',
contentType: "application/json; charset=utf-8",
data: myData,
processData: false,
dataType: 'html',
async: false,
success: function(html) {
window.console.log(html);
}
});
and trying to decode the JSON object using
$GLOBALS["HTTP_RAW_POST_DATA"];
but the contents of variable are printed as
[object Object]
with json_decode() returning NULL (of course).
Any ideas what I need to do to get the at the actual JSON data?
Thanks,
Gaz.
Looks like you are sending a string to the PHP. Jquery by default sends data in a normal post format. PHP can read this data just fine. I would recommend just getting the data you need out of the POST array.
If you are trying to serialize a Javascript object via JSON and then convert it back to an object in the PHP side, then you might want to go the JSON route. You will need a plugin to convert the data from a string to JSON. You might want to consider:
http://code.google.com/p/jquery-json/
You would change the line:
data: myData,
To:
data: $.toJSON(myData),
Then on the PHP side you will still receive the data in the post array and you can convert it with the following command:
$params = json_decode($_POST[]);
Looks like you do not send a JSON object to your php script, just the string 'object Object'.
Have you tried using $_POST?
I handle all of my JSON requests more or less like this:
$params = json_decode($_POST[]);
You are actually sending a string through POST. I recommend using JSON2 to stringify your Javascript object.
Use
var myData = JSON.stringify(myObject, replacer);
Use file_get_contents('php://input') instead $GLOBALS["HTTP_RAW_POST_DATA"];
You've set your dataType to 'html' in your ajax call. Shouldn't it be 'json'? I think your nice json object is being condensed down into a meaningless string.