我在代码中使用 JSONP:
<script>
$.ajax({
url:"http://localhost:8080/pool/main/?pool=abcd",
dataType: 'JSONP',
success:function(response){
$('#pool').append(response);
},
error:function(){
alert("ERROR");
},
});
</script>
Run Code Online (Sandbox Code Playgroud)
我必须使用 JSONP,因为我需要 ajax 跨域
在我的应用程序响应中,“ http://localhost:8080/pool/main/?pool=abcd” 是 HTML 代码。
我想在我的页面中显示此代码,但出现错误,因为我认为我无法返回 html。
错误 - 我的意思是 - 它为我生成了此代码error:function(){
alert("ERROR");
},但我在萤火虫中看到来自我的页面的响应http://localhost:8080/pool/main/?pool=abcd正常。但其次。我不知道如何将响应放入 html 元素。
我的问题是——我能还是不能。
如果我可以 - 如何做到这一点?
我编写了以下代码以将 JSON 数据发送到前端。但是由于跨域安全问题,我们需要将其转换为 JSONP,有人可以建议我需要为此转换修改什么吗?
JsonFactory jfactory = new JsonFactory();
ObjectMapper mapper = new ObjectMapper();
try {
StringWriter stringWriter = new StringWriter();
JsonGenerator jGenerator = jfactory.createJsonGenerator(stringWriter);
jGenerator.useDefaultPrettyPrinter();
jGenerator.writeStartObject(); // {
jGenerator.writeStringField("title", title); // "title" : title
jGenerator.writeStringField("Description", desc); // "desc" :
jGenerator.writeFieldName("images");
jGenerator.writeStartArray(); // [
if(imageArray.size() != 0){
for (String img : imageArray) {
jGenerator.writeString(img); // "msg 1"
}
}
jGenerator.writeEndArray(); // ]
jGenerator.writeEndObject(); // }
jGenerator.close();
response.getWriter().write(stringWriter.toString());
System.out.println(stringWriter.toString());
response.getWriter().close();
} catch (IOException e) {
// TODO Auto-generated catch block …Run Code Online (Sandbox Code Playgroud) 由于完全不受我控制的决定,我处于以下情况:
我在catalog.org上有一个产品列表
单击产品上的"添加到购物车"按钮会发出对Secure.com/product/add/[productKey的AJAX JSONP请求,这会将购物车记录保存到数据库,使用购物车ID设置cookie,然后返回true响应(如果失败则为false)
回到catalog.org,如果响应为真,则向secure.com/cart/info发出另一个AJAX JSONP请求,该请求读取购物车ID cookie,获取记录,并返回购物车中的商品数量
再次返回catalog.org,读取响应并更新页面上的元素,显示购物车中的商品数量(如果有)
此时,单击catalog.org上的"转到购物车"按钮会在secure.com上显示购物车摘要
这在Firefox 17,Chrome 32和IE 11中运行良好.它也适用于我们开发和测试环境中的IE8 - IE10,其中catalog.org是catalog.development.com,catalog.test.com和secure.com是安全的. development.com和secure.test.com分别.
但是,在我们部署到生产之后,这停止了在IE8 - IE10中工作.将产品添加到购物车后,购物车中的商品数量会在catalog.org上成功更新.然后,在单击catalog.org上的"转到购物车"按钮后,secure.com上的购物车摘要显示任何内容,因为它无法读取cookie.在IE开发人员工具中进入缓存>"查看cookie信息"显示没有购物车ID cookie.它应该存在,就像在其他浏览器和我们的开发和测试环境中一样.
我相信正在发生的事情是IE阻止第三方cookie.我们已经为secure.com上的所有请求添加了一个P3P精简策略标头,但cookie仍未设置.我们设置的标题是:
P3P: CP="CAO PSA OUR"
Run Code Online (Sandbox Code Playgroud)
为什么不在IE8-IE10中添加紧凑的策略头修复此问题?我怎样才能解决这个问题,以便在IE的所有版本中使用?
解
下面有几个好主意.我接受了@ sdecima's,因为它听起来最有希望.我们最终结合了其中的一些想法,但设法避免了XDomainRequest:
- 单击产品上的"添加到购物车"按钮会发出对Secure.com/product/add/[productKey的AJAX JSONP请求,这会将购物车记录保存到数据库,使用购物车ID设置cookie,然后返回true响应(如果失败则为false)
我们在secure.com/product/add上更改了操作,以返回一个JSON对象,其中包含指示成功或失败的布尔值以及购物车ID.
- 回到catalog.org,如果响应为真,则向secure.com/cart/info发出另一个AJAX JSONP请求,该请求读取购物车ID cookie,获取记录,并返回购物车中的商品数量
我们更改了回调函数以检查响应对象中的两个属性.如果成功,并且存在购物车ID,我们会在页面上创建隐藏的iframe.srciframe 的属性设置为我们添加到secure.com的新端点.此操作接受购物车ID参数并保存购物车ID Cookie.我们不再需要在secure.com/product/add操作中保存cookie.
接下来,我们更改了secure.com/cart/info上的操作以接受购物车ID参数.此操作将使用购物车ID参数(如果存在)来获取购物车信息,否则它仍将尝试读取cookie.如果我们可以保证iframe已经完成加载并且cookie已经保存在secure.com上,那么这个额外的检查将是不必要的,但是由于浏览器安全限制,我们无法知道iframe何时在catalog.org上完成加载.
最后,CP="CAO PSA OUR"仍然需要P3P标头才能在IE7-IE10中工作.(是的,这也适用于IE7 :)
我们现在有一个解决方案(尽管是一个非常复杂的解决方案),用于保存和访问适用于所有主流浏览器的跨域cookie,至少在我们能够可靠测试的时候.
我们可能会对此进行一些重构.首先,此时对secure.com/cart/info的第二个AJAX JSONP请求是多余的,因为我们可以将原始请求中所需的所有信息返回到secure.com/product/add操作(更改的附带好处)该操作返回一个JSON对象 - 加上我们可以返回一条错误消息,指出如果出现错误则确切失败的原因).
我正在使用 AngularJS,并且想使用一些免费的 API 来获取一些图像。我正在查看 Flickr,但您需要注册一个应用程序才能使用它。我正在寻找可以在球棒右侧使用的东西。
http://www.jsontest.com/接近但无法获取任何图像。
我正在尝试在跨平台中使用 JSONP 响应。我正在使用 HTML 和 JQuery Mobile。有时,当记录数量较多时,响应会在固定字符数后自动被截断,不会读取 JSON 格式的完整响应。我无法得到完整的答复。然而,相同的响应对于 JSON 工作正常,并且可以在 Android 中轻松使用。
在跨平台应用程序中,在浏览器上,当我检查它被截断时,有人对此有想法吗?如果有人可以提供帮助,那将非常感激
更新
在 Apache Tomcat 上它工作正常,但对于 JBOSS 应用程序服务器我面临着问题。maxHttpHeaderSize 可能是一个问题吗?请告诉我 maxHttpHeaderSize 对此有什么影响..?
$.ajax( { url : '', data: {}, dataType:'jsonp', jsonpCallback: 'callbackName', type: 'post'
,success:function (data) {
console.log('ok');
},
error:function () {
console.log('error');
}
});
Run Code Online (Sandbox Code Playgroud)
如何在纯JS中编写相同的功能?
是否有一种编程(读取 Pythonic 和/或 RESTful)方式来访问 Tesco Clubcard 个人历史记录和/或通过唯一的收据令牌进行店内购买?
从Tesco Labs和TESCO API Documentation上的这个帖子来看,情况似乎并非如此
我正在努力使用vue-resource制作JSONP请求.任何人都可以提供一些工作示例来演示定义jsonp回调的正确方法,在Vue组件中处理调用等等.
谢谢
**编辑:**对于其他人,让我们澄清一下情况.重点是什么 - 我在网站上有一个未经过身份验证的用户,我想让他做一些需要身份验证的操作(例如创建帖子).但是,在创建帖子的最后,我想向他显示登录模式窗口,让他使用社交oAuth提供程序登录并成功登录,让帖子获得批准等等.问题是这个从前端到不同域(社交提供商)的呼叫被阻止(CORS问题)并且我试图使用JSONP来克服障碍.试图设置JSONP调用花了我很多时间,最后我决定采用完全不同的方法:
在创建帖子的过程结束时,会创建一个cookie,关注信息所有必要细节中断的操作是什么.之后,显示登录模式.整个登录过程从服务器端完成,最后,当确认用户的身份时,重定向到初始页面.此外,检查cookie并根据数据,中断的操作继续成功执行,因为用户现在已经过身份验证.
@bryceadams再次感谢您的回答!
我需要解析来自 Flickr API 的响应。
http://api.flickr.com/services/feeds/photos_public.gne?tagmode=any&format=json
它在 jsonFlickrFeed jQuery 回调函数中返回响应(这不是有效的 JSON 响应)。
我知道我们可以使用nojsoncallback=1查询删除 Flickr API 的 JSON 回调方法。
但是,如果强制使用 JSON with Padding (JSONP),是否有更好的方法来处理 JSONP 响应?
而不是将响应作为字符串获取,然后修剪 JSON 填充,然后解析剩余的 JSON 数据。
示例 Flickr API 响应 -
jsonFlickrFeed({
"title": "Recent Uploads tagged mountrainier",
"link": "http:\/\/www.flickr.com\/photos\/tags\/mountrainier\/",
"description": "",
"modified": "2016-12-15T16:56:42Z",
"generator": "http:\/\/www.flickr.com",
"items": [ {
"title": "Gateway Arts District Open Studio Tour, December 10, 2016",
"link": "http:\/\/www.flickr.com\/photos\/kimsworldofart\/31274762970\/",
"media": {
"m": "http:\/\/farm1.staticflickr.com\/381\/31274762970_c40599d623_m.jpg"
},
"date_taken": "2016-12-10T15:49:03-08:00",
"description": " <p><a href=\"http:\/\/www.flickr.com\/people\/kimsworldofart\/\">kimsworldofart<\/a> posted a photo:<\/p> <p><a …Run Code Online (Sandbox Code Playgroud) 我是Anguar4的新手,遇到了这个问题:
注入JSONP的脚本没有调用回调
我尝试了不同的API,例如:https: //jsonplaceholder.typicode.com/posts
但是,我的api给了我这个错误.但是,它适用于jQuery,jsonp.我在网上搜索了很多资源,花了很多时间,但无法修复它.这是我的代码:
import { Injectable } from '@angular/core';
import { Http, Headers, Jsonp, URLSearchParams } from '@angular/http';
import 'rxjs/add/operator/map';
@Injectable()
export class ServerService{
constructor(private jsonp: Jsonp){}
getServers(term: string) {
let url = `url`;
let params = new URLSearchParams();
params.set('search', term); // the user's search value
params.set('action', 'opensearch');
params.set('format', 'json');
params.set('callback', 'JSONP_CALLBACK');
return this.jsonp
.get(url, { search: params })
.subscribe(
(data) => {
console.log(data);
},
(error) => {
console.log(error);
});
}
}
Run Code Online (Sandbox Code Playgroud) jsonp ×10
ajax ×3
jquery ×3
javascript ×2
json ×2
android ×1
angular ×1
angularjs ×1
api ×1
browser ×1
cookies ×1
gson ×1
java ×1
p3p ×1
python ×1
restful-url ×1
retrofit2 ×1
vue-resource ×1
web-services ×1