我一直在忙着JSON一段时间,只是把它作为文本推出它并没有伤害任何人(我知道),但我想开始正确地做事.
我见过这样的JSON内容类型很多所谓的"标准":
application/json
application/x-javascript
text/javascript
text/x-javascript
text/x-json
Run Code Online (Sandbox Code Playgroud)
但哪个是正确的,还是最好的?我认为它们之间存在安全性和浏览器支持问题.
我知道有一个类似的问题,如果REST API返回JSON,那么MIME类型是什么?,但我想要一个稍微有针对性的答案.
我理解JSON,但不了解JSONP.维基百科关于JSON的文档是JSONP的最佳搜索结果.它说:
JSONP或"带填充的JSON"是JSON扩展,其中前缀被指定为调用本身的输入参数.
咦?什么电话?这对我没有任何意义.JSON是一种数据格式.没有电话.
JSONP是脚本标记注入,将响应从服务器传递到用户指定的函数.
我可以理解这一点,但它仍然没有任何意义.
那么什么是JSONP?它为什么被创建(它解决了什么问题)?为什么我会用它?
附录:我刚刚在维基百科上为JSONP创建了一个新页面 ; 根据jvenema的回答,它现在对JSONP进行了清晰而全面的描述.
嘿呀,
我知道之前已经问过这个问题,我已经阅读了每个问题的每一个答案,但似乎仍然无法让我的项目正常运行.我的情景与其他问题有点不同,不确定这是否有所不同,但我们走了.
我有一个由Web服务组成的项目.仅服务工作正常,没有问题.还有另一个项目处理事物的UI部分并通过jquery ajax调用这些服务.它一直工作正常,因为我之前没有在Google Chrome上测试过此案例.一切都在Internet Explorer上完美运行.
现在; 我的Web服务应用程序在端口40000(localhost:40000)上运行,UI项目在其他一些随机端口上运行但仍在localhost中.就像我说的,我的ajax调用等在Internet Explorer上完美运行,但是当涉及到谷歌Chrome时,它就失败了.控制台显示以下错误:
XMLHttpRequest cannot load http://127.0.0.1:40000/abc.asmx/TheMethodName. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:17256' is therefore not allowed access. The response had HTTP status code 400.
Run Code Online (Sandbox Code Playgroud)
顺便说一下,它之前就像"localhost:40000",因此互联网上的一些帖子建议我将其更改为IP地址而不是localhost.
无论如何,我还在我的web服务项目上编辑了我的web.config文件并添加了以下内容(这没有任何意义)
<system.serviceModel>
<bindings>
<webHttpBinding>
<binding name="crossDomain" crossDomainScriptAccessEnabled="true">
</binding>
</webHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="http://localhost:17256" />
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET, …Run Code Online (Sandbox Code Playgroud) 我不知道这是否是提出这个问题的合适地方,但我只是想去做.我一直试图弄清楚我想如何发布我的网络应用程序.
这是我的情况:
我创建了一个Web应用程序.想要使用此应用程序的人可以免费使用.但他们需要在我们的网站上注册.
应用程序需要绑定到唯一键.一旦他们在我们的网站上注册,就会生成此密钥.
该应用程序托管在我们的服务器上.
Web应用程序需要易于实现.
我见过:
我见过生成JS脚本的其他服务,例如:
<script type='text/javascript' data-cfasync='false'>window.exampleApi = { l: [], t: [], on: function () { this.l.push(arguments); } }; (function () { var done = false; var script = document.createElement('script'); script.async = true; script.type = 'text/javascript'; script.src = 'https://app.example.com/VisitorWidget/WidgetScript'; document.getElementsByTagName('HEAD').item(0).appendChild(script); script.onreadystatechange = script.onload = function (e) { if (!done && (!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete')) { var w = new PCWidget({c: 'e01fe420-5c14-55p0-bbec-229c7d9t2f0cf', f: true }); done = true; } …Run Code Online (Sandbox Code Playgroud) 我想触发一个推送器专用通道事件,而我的服务器端语言是laravel,我检查了很多资源,但是我没有找到涵盖服务器端和前端的全面方法。最后,我在第一个解决方案中步 :
export const SendChat = () => {
try {
var pusher = new Pusher('YOUR_APP_KEY', {
cluster: 'ap2',
forceTLS: true,
authTransport: 'jsonp',
authEndpoint: `${baseUrl}pusher/auth`,
});
var channel = pusher.subscribe('private-channel');
channel.bind('pusher:subscription_succeeded', function() {
var triggered = channel.trigger('client-EVENT_NAME', { 'message': 'Hi ....' });
console.log(triggered)
});
} catch (error) {
console.error(error);
}
}
Run Code Online (Sandbox Code Playgroud)
叫它到某个地方
<Button onClick={this.props.SendChat} waves='light' >Send</Button>
Run Code Online (Sandbox Code Playgroud)
您必须在推送器帐户设置中启用客户端事件
login to your pusher account -> select the channel ->App Settings -> select Enable client events -> update
Run Code Online (Sandbox Code Playgroud)
添加您的应用程序密钥,通道名称和事件名称之后,我们需要在服务器端进行授权,这是示例laravel代码,首先在web.php中添加此路由
Route::get('pusher/auth', 'PusherController@pusherAuth');
Run Code Online (Sandbox Code Playgroud)
使PusherController.php像这样:
public …Run Code Online (Sandbox Code Playgroud) 我从JSON-P(来自JSON-P VS JSON和维基百科)了解到的是 - JSON-P的发明是为了克服浏览器的相同原始策略并从另一个域加载JSON对象.stackoverflow上有一篇文章,展示了JSON-P调用的工作原理.看来,如果我?callback=?从URL中删除,JSON-P请求就像普通的JSON调用一样,因此被相同的源策略拒绝.这个实例证明了这一点.
现在我有另一个URL:https://graph.facebook.com/100001612121705.json
我使用以下方法从中加载数据(请访问此处获取实例):
$(document).ready(function() {
$.getJSON("https://graph.facebook.com/100001612121705", null,
function(data) {
$.each(data, function(key, val) {
alert(key + ' is ' + val);
});
});
});?
Run Code Online (Sandbox Code Playgroud)
请注意,我没有使用?callback?带有我的URL,但此请求仍然可以从另一个域获取JSON数据!这对我来说非常令人惊讶.任何人都可以解释为什么这个请求不被同源原则规则拒绝?
我已经在服务器中有一个.json对象.它是正确的,没有语法错误(有效的json).我想通过JSONP调用此对象,因为它驻留在与我的应用程序不同的服务器中.
我想我理解如何在客户端实现它,但我不知道该怎么做与服务器部分有关.在关注网络上已有的信息时,我一直有错误.有帮助吗?
javascript ×4
jquery ×4
json ×4
jsonp ×3
ajax ×1
asp.net ×1
c# ×1
content-type ×1
cors ×1
cross-domain ×1
http-headers ×1
iframe ×1
laravel ×1
php ×1
pusher ×1
react-native ×1
reactjs ×1
real-time ×1
terminology ×1
web-services ×1