JSONP cross domain request,but server return a json? - cross-domain

A Cross-domain request bothered me. I want to use ajax request jsonp data from a third-party data-bank. But some works, some not, maybe the callback jsonp-data is not supported, how can I fix it if the data-bank only return json?
function newcreateElement(url) {
$.ajax({
type: "get",
async: false,
url: url,
dataType: "jsonp",
jsonp: "callback",
jsonpCallback: "jsonpcallback",
success: function (json) {
$("#div pre code").html(JSON.stringify(json));
},
error: function (XMLHttpRequest, textStatus, readyState, status) {
alert(textStatus);
alert(XMLHttpRequest);
alert(readyState);
alert(status);
}
})
}

Related

Nodejs-Request promise get JSON response body from POST

I'm trying to make a POST request using request-promise to an HTTP service which returns back JSON data. I'm using resolveWithFullResponse set to true and have the json option set to true. I'm also using the gzip option if that makes a difference.
Is there anyway I can have request-promise automatically convert the response data to JSON? Currently, the response body is a string. Here is what my request options look like:
{
url: 'http://foo.com/getData',
json: true,
body: {
hello: world
},
resolveWithFullResponse: true,
gzip: true
}
You should use transform option of the request module. Find below the request object.
{
url: 'http://foo.com/getData',
json: true,
body: {
hello: world
},
resolveWithFullResponse: true,
gzip: true,
transform: function (body, response) {
if (response.headers['content-type'] === 'application/json') {
response.body = JSON.parse(body);
}
return response;
}
}

Error: Error in Rangy WrappedRange module: createRange(): Parameter must be a Window object or DOM node

I have these two functions:
function menuItemListener( link ) {
var side = link.getAttribute("data-action");
if (side == 'Mark as A' || side == 'Mark as B') {
highlighter(side);
$.ajax({
method: "POST",
url: "http://localhost:3000/",
dataType: "json",
data: JSON.stringify({"rangyobject" : rangy.saveSelection()}),
contentType: "application/json; charset=utf-8",
success: function(result) {
console.log('yei');
}
});
}
toggleMenuOff();
}
function loadHighlights () {
window.addEventListener("load", function load(event){
$.ajax({
method: "GET",
url: "http://localhost:3000/ranges",
dataType: "json",
contentType: "application/json; charset=utf-8",
success: function(result) {
console.log('loadHighlights results: ', result[0].rangyObject);
rangy.restoreSelection(result[0].rangyObject);
}
});
},false);
};
So it's simply storing the rangy.saveSelection() in the DB and then getting it back and trying to rangy.restoreSelection on the its first element.
the console.log looks good but I'm getting an error in the console:
Error: Error in Rangy WrappedRange module: createRange(): Parameter must be a Window object or DOM node
rangy.saveSelection() looks like this in the console:
{win: undefined, rangeInfos: Array, restored: false}
Note the "win: undefined"
When I send it to the DB, I use
data: JSON.stringify({"rangyObject" : rangy.saveSelection()})
When retrieving it back from the DB it looks like:
{rangeInfos: Array, restored: false}
Notice that the 'win' was omitted by the save to the db
I was able to use the serialize and deserialize functions to circumvent this issue, but these don't create the id's with the span's they create, so I ran into another problem.

nodejs use REQUEST.get, callback never called

I am using request module:
request.get({
url: 'https://www.google.com'
}, function (err, response, body) {
console.log('callback called!' );
I opened the request debug mode:
require('request').debug = true;
so i saw the debug output:
REQUEST { method: 'GET',
callback: [Function],
url: 'https://www.google.com' }
REQUEST make request https://www.google.com/
but the callback was never called
so, what's the problem? Is it relate to https?

SharePoint 2010 REST API JQUery Insert, Update, Delete

Can anyone explain or point me to a link with samples of doing Update, Delete using Jquery with the SharePoint 2010 Rest API?
I have the insert working and of course queries since the MSDN documentation explains and every tutorial on the net explains queries but just wondering if anyone ever inserts, updates, deletes data instead of only samples and tutorials on querying? Yes I know I can use the CSOM but I want to learn how this is done via jquery and sharepoint rest?
Also I want to use Merge for updating.
Here's the working insert code:
function insertMilestone() {
var mileStonesListUrl = "/_vti_bin/listdata.svc/Milestones";
var milestone = {};
milestone.Title = "Testing from REST";
var entry = JSON.stringify(milestone);
$.ajax({
type: "POST",
url: mileStonesListUrl,
data: entry,
contentType: "application/json; charset=utf-8",
error: function (xhr) {
alert(xhr.status + ": " + xhr.statusText);
},
success: function () {
getAll();
}
});
}
How to perform CRUD operations using SharePoint 2010 REST Interface
Create
In order to perform a Create operation via REST, you must perform the following actions:
Create an HTTP request using the POST verb.
Use the service URL of the list to which you want to add an entity as
the target for the POST.
Set the content type to application/json.
Serialize the JSON objects that represent your new list items as a
string, and add this value to the request body
JavaScript example:
function createListItem(webUrl,listName, itemProperties, success, failure) {
$.ajax({
url: webUrl + "/_vti_bin/listdata.svc/" + listName,
type: "POST",
processData: false,
contentType: "application/json;odata=verbose",
data: JSON.stringify(itemProperties),
headers: {
"Accept": "application/json;odata=verbose"
},
success: function (data) {
success(data.d);
},
error: function (data) {
failure(data.responseJSON.error);
}
});
}
Usage
var taskProperties = {
'TaskName': 'Order Approval',
'AssignedToId': 12
};
createListItem('https://contoso.sharepoint.com/project/','Tasks',taskProperties,function(task){
console.log('Task' + task.TaskName + ' has been created');
},
function(error){
console.log(JSON.stringify(error));
}
);
Read
In order to perform a Read operation via REST, you must perform the following actions:
Create an HTTP request using the GET verb.
Use the service URL of the list item to which you want to add an
entity as the target for the GET.
Set the content type to application/json.
JavaScript example:
function getListItemById(webUrl,listName, itemId, success, failure) {
var url = webUrl + "/_vti_bin/listdata.svc/" + listName + "(" + itemId + ")";
$.ajax({
url: url,
method: "GET",
headers: { "Accept": "application/json; odata=verbose" },
success: function (data) {
success(data.d);
},
error: function (data) {
failure(data.responseJSON.error);
}
});
}
Usage
getListItemById('https://contoso.sharepoint.com/project/','Tasks',2,function(taskItem){
console.log(taskItem.TaskName);
},
function(error){
console.log(JSON.stringify(error));
}
);
Update
To update an existing entity, you must perform the following actions:
Create an HTTP request using the POST verb.
Add an X-HTTP-Method header with a value of MERGE.
Use the service URL of the list item you want to update as the target
for the POST
Add an If-Match header with a value of the entity’s original ETag.
JavaScript example:
function updateListItem(webUrl,listName,itemId,itemProperties,success, failure)
{
getListItemById(webUrl,listName,itemId,function(item){
$.ajax({
type: 'POST',
url: item.__metadata.uri,
contentType: 'application/json',
processData: false,
headers: {
"Accept": "application/json;odata=verbose",
"X-HTTP-Method": "MERGE",
"If-Match": item.__metadata.etag
},
data: Sys.Serialization.JavaScriptSerializer.serialize(itemProperties),
success: function (data) {
success(data);
},
error: function (data) {
failure(data);
}
});
},
function(error){
failure(error);
});
}
Usage
var taskProperties = {
'TaskName': 'Approval',
'AssignedToId': 12
};
updateListItem('https://contoso.sharepoint.com/project/','Tasks',2,taskProperties,function(item){
console.log('Task has been updated');
},
function(error){
console.log(JSON.stringify(error));
}
);
Delete
To delete an entity, you must perform the following actions:
Create an HTTP request using the POST verb.
Add an X-HTTP-Method header with a value of DELETE.
Use the service URL of the list item you want to update as the target
for the POST
Add an If-Match header with a value of the entity’s original ETag.
JavaScript example:
function deleteListItem(webUrl, listName, itemId, success, failure) {
getListItemById(webUrl,listName,itemId,function(item){
$.ajax({
url: item.__metadata.uri,
type: "POST",
headers: {
"Accept": "application/json;odata=verbose",
"X-Http-Method": "DELETE",
"If-Match": item.__metadata.etag
},
success: function (data) {
success();
},
error: function (data) {
failure(data.responseJSON.error);
}
});
},
function (error) {
failure(error);
});
}
Usage
deleteListItem('https://contoso.sharepoint.com/project/','Tasks',3,function(){
console.log('Task has been deleted');
},
function(error){
console.log(JSON.stringify(error));
}
);
Please follow List Items manipulation via REST API in SharePoint 2010 article for a more details.
Here is the update and delete, it wasn't as hard as I thought it was going to be and it works.
Hopefully this will help someone out because there is so much bogus information on using the REST API and I see a zillion posts on querying but none on Insert, Update, Delete.
//update
function updateMilestone(id) {
var mileStonesUrl = "/_vti_bin/listdata.svc/Milestones";
mileStonesUrl = mileStonesUrl + "(" + id+ ")";
var beforeSendFunction;
var milestoneModifications = {};
milestoneModifications.Title = "Updated from REST";
var updatedMilestoneData = JSON.stringify(milestoneModifications);
//update exsiting milestone
beforeSendFunction = function (xhr) {
xhr.setRequestHeader("If-Match", "*");
// Using MERGE so that the entire entity doesn't need to be sent over the wire.
xhr.setRequestHeader("X-HTTP-Method", 'MERGE');
}
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
processData: false,
beforeSend: beforeSendFunction,
url: mileStonesUrl,
data: updatedMilestoneData,
dataType: "json",
error: function (xhr) {
alert(xhr.status + ": " + xhr.statusText);
},
success: function () {
alert("Updated");
getAll();
}
});
function deleteMilestone(id) {
var mileStonesUrl = "/_vti_bin/listdata.svc/Milestones";
mileStonesUrl = mileStonesUrl + "(" + id+ ")";
$.ajax({
type: "DELETE",
contentType: "application/json; charset=utf-8",
processData: false,
url: mileStonesUrl,
error: function (xhr) {
alert(xhr.status + ": " + xhr.statusText);
},
success: function () {
alert("deleted");
getAll();
}
});
}
}
I recently worked with the REST API for SP 2013, as a Example POC that can be used for any call implementation i.e. JQuery, C# etc.
Using POSTMAN
First get your digest token:
A method was found on this site : http://tech.bool.se/basic-rest-request-sharepoint-using-postman/​
[Credit where credit is due]
POST
http://<SharePoint Domain Url>/sites/<Site name>/_api/contextinfo
Header:
Accept : application/json;odata=verbose
Body:
Clear the body ​
From the payload use "FormDigestValue" value and put it into your headers with the key : X-RequestDigest when making actions that alter items in SharePoint.
Reading data:
GET
http://<SharePoint Domain Url>/sites/<Site name>/_api/web/getfolderbyserverrelativeurl('/Sites/<Site Name>/Shared Documents/My Folder')/files?$select=Name
Headers:
Accept : application/json;odata=verbose​
When it comes to create, update , delete you need the digest token or an authorization token to perform these actions, this token is highlighted at the begining to to retrieve.
​Creating Data
POST
http://<SharePoint Domain Url>/sites/<Site Name>/_api/web/folders​
Headers:
Accept : application/json;odata=verbose
X-RequestDigest : 'GUID looking toking'
Content-Type : application/json;odata=verbose
Body:
{ '__metadata': { 'type': 'SP.Folder' }, 'ServerRelativeUrl': '/Sites/<Site Name>/Shared Documents/Some Folder/POC3'}​
Note:
'ServerRelativeUrl' the folder on the end POC3 is the folder that I want to create
Related resources:
http://msdn.microsoft.com/en-us/library/office/fp142380(v=office.15).aspx
Note: PostMan was used for this example and other application may need you to url encode the endpoint.
The above Request Structure can be used for all requests, the related resource highlights some of the standard methods that can be used with the REST Api

The 'Uncaught SyntaxError: Unexpected token : ' in jsonp

I have already get the response json data from server to browser, but it is confused that the data can not be displayed in the browser and I found the error in the console that told me 'Uncaught SyntaxError: Unexpected token :'. Here is my code in node js.
function callFacebook(){
$.ajax({
url: "http://192.168.37.179:8888/facebook/connect?callback_=[TIMESTAMP]",
type: "GET",
dataType: "jsonp",
jsonp:"jsonp",
cache: true,
timeout: 5000,
success: function(data) {
execute(data);
},
error:function() { console.log('Uh Oh!'); }
});
}
and here is the response json data:
res.header('Content-Type','application/json');
res.header('Charset','utf-8');
res.send({"something": "father"});
From the server you are sending just normal JSON data, but on client you are expecting JSONP.
The response from server is not JSONP and browser does throw exception as syntax is wrong.
If you need to send JSONP from server, then if you are using express add extra use:
app.configure(function() {
app.set('jsonp callback', true);
});
Then to send JSONP just slightly change res. You don't need to set any header anymore, as they will be automatically detected:
res.jsonp({ hello: 'world' });
On client side, jQuery will add callback it self, so use just this simplified way:
$.ajax({
url: "http://192.168.37.179:8888/facebook/connect",
type: 'GET',
dataType: 'jsonp',
cache: true,
timeout: 5000,
success: function(data) {
console.log(data)
},
error: function(xhr, status, error) {
console.log('error[' + status + '] jsonp');
}
});
As well if your node is proxied through nginx or any other web platform, don't forget to enable utf8 encoding there.

Resources