using ajax to retrieve an xml response and display results - php

I know how to post using $.ajax method.
I have a form that posts data to a payment API this is what the response looks like:
<ns2:GetTransactionsResponseType xmlns:ns2="http://www.paymentgateway.com/schema/api/2.0/service.xsd">
<Timestamp>2012-08-14T17:33:55.213+10:00</Timestamp>
<Version>2.0</Version>
<Status>Success</Status>
<total>0</total>
</ns2:GetTransactionsResponseType>
as you can see the total of transactions is 0,
so step 1 make the post request using $.ajax, then on success: I want to do $('#results'),html('the total transactions are: '+numberoftransactions);
any ideas/suggestions ? thank you

you can try something like this
$(function(){
$.ajax({
type: "GET",
url: $uri,
dataType: "xml",
async: false,
contentType: "text/xml; charset=\"utf-8\"",
complete: function(xmlResponse) {
// So you can see what was wrong...
console.log(xmlResponse);
console.log(xmlResponse.responseText);
$("#preForXMLResponse").text(xmlResponse.responseText);
}
});
});
try finding required value in responseText
for more information please visit this link
The XMLHttpRequest Object

I guess rahul has answered your question so I just wanted to add that if you're trying to pass data to the url and get back response accordingly then you could take advantage of the data property while making ajax request.
suppose you're trying to get xml response according to user profile so you have to pass user id to the url to get accurate response. You can just do it like this
$(function(){
$.ajax({
type: "GET",
url: $uri,
data: $user_id, //this id will be passed with the request to the url as query string
dataType: "xml",
async: false,
contentType: "text/xml; charset=\"utf-8\"",
complete: function(xmlResponse) {
// So you can see what was wrong...
console.log(xmlResponse);
console.log(xmlResponse.responseText);
$("#preForXMLResponse").text(xmlResponse.responseText);
}
});
});
Hope this helps or may be I didn't understand properly, what you were looking for.

Related

Angular $http post not posting variable correctly for PHP

I have a PHP service at api/add in my application, and you can pass it rq and name via POST. rq tells the service what function to perform, so in my example addCity is defined, and it inserts a city into the database, and name is the name of the city.
So, with that being said, here is my angular code. I'm defining an angular module above with ngRoute.
whereApp.controller('AddCityCtrl', function($scope, $http) {
$scope.addCity = function() {
$http({
method: "POST",
url: '/api/add/',
data: { rq:'addCity', name: $scope.name },
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
}).success(function (data, status, headers, config) {
console.log(data);
});
/*
$.ajax({
url: "/api/add/",
type: "POST",
data: { rq: 'addCity', name: $scope.name },
dataType: "json"
})
.success(function(data) {
console.log(data);
});
*/
}
});
Here's the problem. The ajax request (jQuery style that is commented out) works. I'm wanting to use the angular style since, well, it's what I'm using and what I'm trying to learn a little bit more about. The jQuery ajax call gives me back the success message that I have from server-side, and the $http method says that the rq variable is not defined, which I'm accessing via $_POST['rq'].
I've done some research already on Google, but so far have only come up with adding headers: {'Content-Type': 'application/x-www-form-urlencoded'} like this post says.
Can anyone tell me what the difference is between these two ajax calls (or if there is something else I haven't considered)?
Since it is json data that is being sent in php you cant get it by simple $_POST you need to do this kind of stuff to get this posted data
$data=file_get_contents('php://input');
$dataobj= json_decode($data);
Here you get data first then decode it from json to normal object

How do I "understand" what data I receive from PHP with Ajax?

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'
});

Format of jsonp response

I need a jsonp response from cross domain url. My jsonp code is here
$.ajax({
dataType: 'jsonp',
async: false,
contentType: "application/json",
jsonpCallback: "domaincheck",
data:{
id:k,
domain:l
},
url: 'http://example.com/param',
success: function (data) {
console.log(JSON.stringify(data));
},
In the php file, the output is like this:
<?php
echo $_GET['callback']."([Correct])";
?>
I knew that the data what I am returning back is incorrect. Because I think we should pass response as json data only. But in this case, sending only "correct" as response, how should we set it, so that we get the response correctly.
The error what I get in console is this:
Uncaught SyntaxError: Unexpected identifier

POST json data via ajax sends an empty array

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.

problem receiving data from post in php

This is my called by post to mi php in the server
$.ajax({
async: false,
type: "POST",
url: "services/ModelsService.php",
data: "{IdModelo: "+$("#brand").val()+"}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(values){
//do something
}
});
Now when i'm going to uses the value send from the js. always failed appears blank. But the data it's sending good because when i debug the called with charles debugging proxy works well the request
this is my php file
$json = json_decode($_POST,true);
echo $json[1]; //this bring me always blank
What i'm doing wrong in my code
echo $json['IdModelo'];
This is how you get it.
Passing the second argument true to json_decode will return an associative array so you should access array values using associative (string) index.

Categories