Getting JSON data from PHP script via AJAX - php

My jquery code:
var jsonData;
$.ajax({
url: 'http://mysite.lv/projects/addform',
dataType: 'json',
success: function(response) {
jsonData = response;
console.log('Works');
}
});
My Controller function at http://mysite.lv/projects/addform:
$jsonData = array('x' => 'send x', 'y' => 'send y');
echo json_encode($jsonData);
In console:
GET http://mysite.lv/projects/addform 500 (Internal Server Error)
XHR finished loading: GET "http://mysite.lv/projects/addform".

A 500 error means that your PHP script is failing.
The snippet you added is valid PHP, but the problem is likely elsewhere in the PHP code (or server configuration)
Try debugging by manually loading (that is, open it in your browser) your http://mysite.lv/projects/addform page and making sure it displays the data you expect.
Also enable PHP error reporting — see How to get useful error messages in PHP? here for details.

Related

How to use HTTP request to retrieve data from Laravel API?

I am currently learning the Laravel API, and have been developed a very simple API that retrieves data from the database by simply entering 127.0.0.1:8000/api/XXX to the browser, however, when I tried to use ajax call to get data from the exact same url, the ajax always showed that the HTTP request was failed, the ajax codes I used are following:
$.ajax({
url: "127.0.0.1:8000/api/XXX",
success: function(data) {
let response = JSON.parse(data);
displayResult(response, 1);
}
})
.done(function() {
alert( "success" );
})
.fail(function() {
alert( "error" );
})
And this code always resulted in alert("error");, therefore I am wondering that maybe there are some Routes needed to be written in order to let the API properly processes HTTP request? I have already defined a route in routes\api.php:
Route::apiResource('XXX', 'XXXController');
PS: when entering the API URL to the browser, it worked fine, it went wrong when doing an ajax call with the API URL.
Edit
These are the errors I got from the browser console after I used function(jqXHR, textStatus, errorThrown) to catch the errors
DOMException: Failed to execute 'open' on 'XMLHttpRequest': Invalid URL
at Object.send (https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js:2:79420)
at Function.ajax (https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js:2:77118)
at retrieveAllBooks (http://127.0.0.1:8000/js/api-query.js:25:5)
at HTMLInputElement.<anonymous> (http://127.0.0.1:8000/js/api-query.js:10:7)
at HTMLInputElement.dispatch (https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js:2:41772)
at HTMLInputElement.y.handle (https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js:2:39791)
I am not exactly sure why it is an invalid URL, since if I copy and paste this link to browser, nothing goes wrong...
(Posted on behalf of the question author).
Actually the solution is simple, just add http:// to the url.

PHP file_get_contents("php://input") missing request content

I have an issue in php codeigniter, Posting data from client to server like below, and in server i used to read post data by file_get_contents("php://input"). It truncate the data and displaying only first 50 character. It was working fine in my previous server, now we have changed to new server after that it getting an issue.
var base_url = "http://www.mydomain.in/";
$.ajax({
url:base_url+ "index.php/api/transactions/status",
data: {"username":"logimax","passwd":"pass#2015","status":"Y"},
dataType:"JSON",
type:"POST",
success:function(data){
console.log(data);
},
error:function(error)
{
console.log(err);
}
});
Firebug Report:
We could monitor the post data and response in firebug like the below,
Request URL:http://www.mydomain.in/index.php/api/transactions/status
Request Method:POST
Request header: Accept:application/json, text/javascript,
Form Data
username:logimax
passwd:pass#2015
status:Y
Response:
string(50) "username=l
In server
Server side code: using codeigniter REST service.
public function transactionsByStatus_post()
{
var_dump(file_get_contents('php://input')); // Its getting truncate. Not fully displaying the values.
//Response sending as JSON Format
}
Check to see if the xdebug extension is enabled in your php.ini.
If so, perhaps try these settings:
xdebug.var_display_max_data=-1
xdebug.var_display_max_children=-1
xdebug.var_display_max_depth=-1

ajax response returned incorrectly on live server

I'm having problems with ajax responses on my live server which all appear to work on my local server.
I'm making the request as follows:
$.ajax(
{
url : formURL,
type: "POST",
data : postData,
dataType: 'json',
success:function(data, textStatus, jqXHR)
{
console.log("ajax response:", data);
//DO SOME STUFF
},
error: function(jqXHR, textStatus, errorThrown)
{
console.log("Error", errorThrown);
//if fails
}
});
In the live server I can see the response correctly in the network panel in Chrome and all looks ok. However console shows nothing at all and fails to act on the success. I can see no errors in console.
If I remove dataType: "json" I can see the messages in console but the data that should be displayed is poorly formatted as:
array() array() array('result': true)
I can't see where the additional arrays are coming from.
On my test server everything shows correctly in the browser and in console. With or without dataType
The response is coming from PHP created in laravel 4.2 on php 5.5. This is on https request rather than http. I don't know if that makes a difference?
My php is:
$formMessage = array(
'result' => true,
'title' => 'Thank you for your email',
'message' => '<p>Thank you for your Message. We will contact you shortly (during normal business hours) to respond to your enquiry.
</p>'
);
return Response::json($formMessage);
Are there any configurations in either php, jquery or laravel 4.2 that I'm missing that would affect this behaviour?
Text shown in chrome console for the response (being displayed by console.log())
ajax response: Array
(
)
Array
(
)
{"result":true,"title":"Thank you for your email","message":"<p>Thank you for your Message. We will contact you shortly (during normal business hours) to respond to your enquiry.<\/p><p>"}
This is with NO dataType
Thanks

jQuery JSONP Call towards PHP backend: No HTTP response

Update IV / Current status: I've now confirmed trough another question that the character encoding of the file is fine and not the cause of the problem. I've also tested against another server and the error still persists. It does however work towards localhost.
So to summarize: JSONP call works towards localhost, but when running against external domains the response from the server is empty (no header / no http response code). When copying the requested URL and inserting it directly in a browser, the output is correct with correct formating (utf-8 / json).
Fiddle: http://jsfiddle.net/5SJvp/1/
Update III: I'm now able to get it working succesfully on localhost. However, using the exact same code (both client and server) towards my production domain it still fails. The response from the server is "empty" meaning to say it returns no http status code.
Update II: After some more debugging I noticed that the response does not include an http status code. This probably is the cause of my problem? I assume this means there is something wrong server side, but I cannot for the life of me see where.
Update I: Snip from jQuery where to request seems to halt.
// Do send the request
// This may raise an exception which is actually
// handled in jQuery.ajax (so no try/catch here)
xhr.send( ( s.hasContent && s.data ) || null );
Params (from Firebug)
_ 1356655864905
callback jQuery18308375673194150332_1356655863817
p 0522
pl 12
s false
secret ##############################
u request12341299
Request (from Firebug)
Accept text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Accept-Encoding gzip, deflate
Accept-Language nb-no,nb;q=0.9,no-no;q=0.8,no;q=0.6,nn-no;q=0.5,nn;q=0.4,en-us;q=0.3,en;q=0.1
Connection keep-alive
Host localhost:8888
Referer http://localhost:8888/popup.html
User-Agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20100101 Firefox/17.0
X-Requested-With XMLHttpRequest
Original question:
I'm struggling with what seems to be a common problem, but I've yet to find a solution. I'm trying to execute a very simple jsonp call using jQuery. The problem is that either a) nothing is happening or b), the response from the server is empty.
I've tried several different approaches, using both the $.ajax method and the $.getJSON method. Both produce the same faulty result. Using the code below nothing happens: Using the Chrome debugger I can see that it simply stops its execution halffway trough the method. However using Wireshark I can see that the client performs the three way handshake and thusly prepars to send data, it just fails to do that.
If I remove the callback=? it does execute, however the response is malformed (or at least, I think so since I can only see a response marked with a red line in Firebug).
$.ajax({
url: "http://mydomain.com/asd.php", //"http://localhost:8888/index.php",
dataType: 'jsonp',
type: 'GET',
data: {p:p, u:u, s:symbols, pl:pl, secret:secret},
contentType: "application/json; charset=utf-8",
async: false,
success: function(data){
console.log("What " + data.test);
},
error: function(data){
console.log("failed for some reason");
}
});
Server code ($callback = $_GET["callback"]
<?php header('content-type: application/json; charset=utf-8');
.
.
.
$data = array
(
"message" => $message,
"status" => $statuscode,
"length" => strlen($message)
);
echo $callback . '('.json_encode($data) .')';
exit;
?>
Here is the server response with manually typed input.
funcName({"message":"!0b7(cb6Gv40","status":"OK","length":12})
It is hard to debug this without a jsfiddle/jsbin, so my best suggestion would be to try getting the request to work with fake, static data (just an empty JSON struct, {}, will do).
It seems that the problem might lie in how you are using json_encode, since you write that when you add the callback=? param the response looks mangled. The suggested test will let you diagnose better where the issue lies.
This will obviously NOT work if you did not set up your SSL certificates properly.
This works properly when I transform the https to http: http://jsfiddle.net/eysEe/
var u = "test";
var p = 1234;
var symbols = false;
var pl = 16;
var secret = "c68f39913f901f3ddf44c707357a7d70";
$.ajax({
url: "http://serve.pin2pass.com?index.php",
dataType: 'jsonp',
type: 'GET',
data: {
p: p,
u: u,
s: symbols,
pl: pl,
secret: secret
},
contentType: "application/json; charset=utf-8",
async: false,
success: function(data) {
$('#test').text(data.message);
},
error: function(data) {
$('#test').text("SDf");
}
});
You can tell if you have bad SSL installation when "https://serve.pin2pass.com?index.php" leads to a risky page. Maybe you never intended to put it in https mode ?
callback is the universal GET param for wrapper function name for the jsonp. When you use callback=? in jQuery request, jQuery will parse the ? into something else with a time stamp so it will be always be a unique value. The API server will wrap the json in this unique function name, and jQuery stores the name so it can use it to unwrap the response.
Some API's are not flexible and require their own specific name in which case you can use the jsonpCallback option in either $.ajax or set it globally in $.ajaxSetup
See $.ajax API docs: http://api.jquery.com/jQuery.ajax/
Starting from your code I've set it up locally and everything works as expected:
test.php :
<?php
$callback = $_GET["callback"];
$data = array
(
"message" => 'test',
"status" => 200,
"length" => strlen('test')
);
echo $callback . '('.json_encode($data) .')';
exit;
test.html :
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script>
$(document).ready(function(){
$.getJSON("http://localhost/test.php?callback=?",
{
whatever: 1,},
function(data) {
alert("hmm");
});
});
</script>
</head>
<body>
</body>
</html>
Two things that could help you :
Not putting the callback=? in your call fails because the JSON returned from your server is not valid JSON (due to the parenthesis around your json data). $.getJSON will silently fail in this case. If you want to see the error, use $.ajax instead.
Your problem might come from the fact that you're apparently trying to use https here. In Chrome at least, making an AJAX request to an https URL with an invalid certificate (I assume your localhost or test domain doesn't have a valid certificate) just puts an error in the console. The browser never prompts with the "are you sure?" about the certificate.
Hope it helps
Hm, can you try using 'Fiddler' to debug the call? Perhaps that empty server response isn't that empty after all.
Or maybe your server has some strange security settings, and checks the REFERRER header to block out external calls?
If you can give a full url to your app I could test it for you =)
So, with the new fiddle it was much easier to work. This is a working sample of your call-
var u = "test";
var p = 1234;
var symbols = false;
var pl = 16;
var secret = "c68f39913f901f3ddf44c707357a7d70";
$.ajax({
url: "https://serve.pin2pass.com/index.php",
dataType: 'jsonp',
type: 'GET',
data: {
p: p,
u: u,
s: symbols,
pl: pl,
secret: secret
},
contentType: "application/json; charset=utf-8",
aync:true,
success: function(data) {
$('#test').text(data.message);
},
error: function(data) {
console.log("failed for some reason");
}
});​
jsfiddle
I hope I am not missing something here. The only change I had to do is in the request url, from
https://serve.pin2pass.com?index.php
to
https://serve.pin2pass.com/index.php
Hope this solves it.

Ajax "Failed to load resource"

jQuery('input').live('click',function(e){
$.getJSON(
"/json.php",
function(data){
the_name = data.name;
}
);
});
When we press , it should make a json query.
Bit it gives errors.
In Google Chrome console:
Failed to load resource http://site.com/json.php
Uncaught TypeError: Cannot read property 'name' of null
In Firefox console:
GET http://site.com/json.php - is bolded with red color.
data is null; the_name = data.name;
The strange is when I open http://site.com/json.php, browser gives me a normal json code like:
{"name":"Mary"}. It is encoded with php json_encode();
What is the problem?
maybe your json string is not correct:
try
$.get("/json.php", function(data) {alert(data)});
if you see you data in the alert box try:
$.get("/json.php", function(data) {
var obj = $.parseJSON(data);
alert(obj.name)
});
Your json.php script didn't set the Content-Type: application/json HTTP header?
Load up Firebug and check the request and response using the Console. Make sure the request is getting sent properly and that the response from the server is properly formatted JSON.

Categories