我想从jQuery向AJAX POST请求添加自定义标头.
我试过这个:
$.ajax({
type: 'POST',
url: url,
headers: {
"My-First-Header":"first value",
"My-Second-Header":"second value"
}
//OR
//beforeSend: function(xhr) {
// xhr.setRequestHeader("My-First-Header", "first value");
// xhr.setRequestHeader("My-Second-Header", "second value");
//}
}).done(function(data) {
alert(data);
});
Run Code Online (Sandbox Code Playgroud)
当我发送此请求并使用FireBug观看时,我看到此标题:
选项xxxx/yyyy HTTP/1.1
主机:127.0.0.1:6666
User-Agent:Mozilla/5.0(Windows NT 6.1; WOW64; rv:11.0)Gecko/20100101 Firefox/11.0
接受:text/html,application/xhtml + xml, application/xml; q = 0.9,/ ; q = 0.8
Accept-Language:fr,fr-fr; q = 0.8,en-us; q = 0.5,en; q = 0.3
Accept-Encoding:gzip,deflate
Connection:keep -alive
Origin:null
Access-Control-Request-Method:POST
Access-Control-Request-Headers:my-first-header,my-second-header
Pragma:no-cache
Cache-Control:no-cache
为什么我的自定义标题会转到Access-Control-Request-Headers:
Access-Control-Request-Headers:my-first-header,my-second-header
我期待像这样的标头值:
My-First-Header:第一个值
My-Second-Header:第二个值
可能吗?
我正在尝试向WCF服务(我拥有)进行跨域HTTP请求.我已经阅读了几种处理跨域脚本限制的技术.因为我的服务必须同时兼顾GET和POST请求,所以我无法实现一些动态脚本标记,其src是GET请求的URL.由于我可以自由地在服务器上进行更改,因此我开始尝试实施一种解决方法,该方法涉及配置服务器响应,以包含"Access-Control-Allow-Origin"标头和带有OPTIONS请求的"预检"请求.我从这篇文章中得到了一个想法:让CORS正常工作
在服务器端,我的Web方法是在HTTP响应中添加"Access-Control-Allow-Origin:*".我现在可以看到响应包含此标题.我的问题是:我如何"预检"一个请求(OPTIONS)?我正在使用jQuery.getJSON来发出GET请求,但浏览器会立即取消臭名昭着的请求:
Access-Control-Allow-Origin不允许使用origin http:// localhost
有人熟悉这种CORS技术吗?需要在客户端进行哪些更改以预检我的请求?
谢谢!
我正在MVC3中构建一个应用程序,当用户进入我的网站时,我想知道该用户的时区.我想知道如何在c#中执行此操作而不是在javaScript中执行此操作?
我正在使用Vue.js和vue-router开发SPA,现在我正在使用JWT处理授权/身份验证.我对后端(API端点)进行了整理,以便它响应登录时发出令牌,并在后续请求中检查必需的头.我现在想要实现客户端(Vue.js)方面.
据我了解,从根本上说,我需要做的是要求对除"/"和"/ login"之外的所有路由进行身份验证.如果存在身份验证,则我在Authorization标头中提交令牌(在成功登录后存储在localStorage中).如果无法在服务器上成功验证,则由于错误响应,用户将被重定向到"/ login".
所以,我有几个问题需要做些什么来实现这个:
除了登录端点之外,我如何最好地为每个请求提交标头?我知道JQuery,我用于AJAX,我可以配置一个全局'ajaxSetup',它将导致每个请求都提交头,但我如何指定异常?单独将标头添加到每个API端点请求是很麻烦的.
同样,如何设置一个身份验证预检查,适用于除上述2('/'和'/ login')之外的所有路由?
鉴于我正在使用显然有效的身份验证(显然是因为它仍然必须在API端点上进行验证)以确定是否显示某些菜单项等,是否可以使其更加精细化并根据令牌有效负载中的"范围"字段确定不同权限级别的不同内容?显然,处理JWT令牌的最简单方法纯粹是确定它是否存在,因此在客户端不需要解析内容.但鉴于JWT确实允许有意义的内容,尝试在客户端和服务器上使用该含义是一个坏主意吗?显然,如果令牌本身是加密的,那么这变得不太实用,所以我的想法是使用未加密的令牌(并确保在有效载荷中没有任何后果暴露).
API需要指定api版本application/vnd.api+json;version=1,它还需要安全的x-app-id和x-app-secret.有没有办法在Ember的RESTAdapter中指定它?
尝试请求标头后
App.Adapter = DS.RESTAdapter.extend({
namespace: 'api',
beforeSend: function(xhr) {
xhr.setRequestHeader('x-my-custom-header', 'some value');
}
})
Run Code Online (Sandbox Code Playgroud)
App.Adapter = DS.RESTAdapter.extend({
bulkCommit: true,
namespace: 'api',
headers: {
'Accept': 'application/vnd.app+json;version=1',
'x-appid': '2375498237',
'x-secret': '238945298235236236236236375923'
},
ajax: function(url, type, hash) {
if (this.headers !== undefined) {
var headers = this.headers;
hash.beforeSend = function (xhr) {
Ember.keys(headers).forEach(function(key) {
xhr.setRequestHeader(key, headers[key]);
});
};
}
return this._super(url, type, hash);
}
});
App.Store = DS.Store.extend({ adapter: App.Adapter.create() });
App.Store = App.Store.create();
Run Code Online (Sandbox Code Playgroud)
不再需要上面提到的解决方案,因为Ember现在默认支持此行为.您只需要提供headers,它将自动添加.
查看这里的文档 …
我正在使用jQuery AJAX查询Web服务.我的查询如下所示:
var serviceEndpoint = 'http://example.com/object/details?version=1.1';
$.ajax({
type: 'GET',
url: serviceEndpoint,
dataType: 'jsonp',
contentType: 'jsonp',
headers: { 'api-key':'myKey' },
success: onSuccess,
error: onFailure
});
Run Code Online (Sandbox Code Playgroud)
当我执行此操作时,我得到403的状态错误.我不明白为什么我的调用导致状态代码为403.我控制了我的服务的安全性并且它被标记为全开.我知道密钥是有效的,因为我在另一个呼叫中使用它,这是有效的.以下是有效的通话:
var endpoint = 'http://example.com/object/data/item?version=1.1';
$.ajax({
type: 'POST',
url: endpoint,
cache: 'false',
contentType:'application/json',
headers: {
'api-key':'myKey',
'Content-Type':'application/json'
},
data: JSON.stringify({
id: 5,
count:true
}),
success: onDataSuccess,
error: onDataFailure
});
Run Code Online (Sandbox Code Playgroud)
我知道这是两个不同的端点.但我100%确信这不是服务器端身份验证或权限错误.再一次,服务器端的一切都是敞开的.这意味着我在客户端请求上犯了一些错误.
我觉得我应该知道这个请求是在开发期间做出的.所以,我是从http:// localhost:3000运行的.出于这个原因,我立即认为这是一个CORS问题.但一切看起来都很正确 我的POST请求有效,但我的GET并没有让我绝对感到沮丧.我错过了什么吗?会是什么呢?
我正在尝试对iContact API执行请求,该请求需要使用自定义标头进行身份验证(http://developer.icontact.com/documentation/authenticate-requests).这是我的代码:
$.ajax({
type: "GET",
url: "https://app.icontact.com/icp/a/",
contentType: "application/json",
beforeSend: function(jqXHR, settings){
jqXHR.setRequestHeader("Accept", "application/json");
jqXHR.setRequestHeader("Api-Version", iContact_API_version);
jqXHR.setRequestHeader("Api-AppId", iContact_appID);
jqXHR.setRequestHeader("Api-Username", iContact_username);
jqXHR.setRequestHeader("API-Password", iContact_appPassword);}
});
Run Code Online (Sandbox Code Playgroud)
由于某种原因,请求没有通过.但是,当我手动执行相同的请求(使用Chrome REST控制台)时,它可以正常工作.如果我取出自定义标头(API-*),请求会通过但当然身份验证失败,我会回到常规HTML页面.
我切换到Firefox并检查了请求/响应标头:
请求:
Host app.icontact.com
User-Agent Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language en-us,en;q=0.5
Accept-Encoding gzip,deflate
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive 115
Connection keep-alive
Origin http://184.72.61.244
Access-Control-Request-Me... GET
Access-Control-Request-He... api-appid,api-password,api-username,api-version
Run Code Online (Sandbox Code Playgroud)
响应:
HTTP/1.1 302 Found
Date: Tue, 14 Jun 2011 23:43:56 GMT
Server: Apache/2.2.9 (Debian)
Set-Cookie: intellicontact_phpsess=1c7ca333017b47f46edd893dae584781; path=/; domain=.icontact.com; secure; HttpOnly …Run Code Online (Sandbox Code Playgroud) 我正在使用jQuery Fileupload上传文件.它不发送我设置到服务器的标头.为什么Authorization标头仅在IE中缺失但在chrome中传递?
这是代码:
upload_photo: function(){
var url = '/api/v1/upload';
$('#photoupload').fileupload({
url: url,
dataType: 'json',
paramName: 'uploadFile',
beforeSend: function ( xhr ) {
setHeader(xhr);
$("#check_progress").html('true');
},
done: function (e, responseJSON) {
var id = responseJSON.result.id;
url = responseJSON.result.url;
var photo_ids = $("#photo_ids");
var val = photo_ids.val();
photo_ids.val(val + id.toString() + ",");
$(".photothumb-wapper").append('<div class=\"photothumb\" id="post_photo_'+id+'"><div><img src=\"'+url+'\" /></div><img class=\"thumb-delete photo_delete\" id=\"'+id+'\" title=\"Remove\" src=\"/assets/delete-red.png\"></div>');
$("#check_progress").html("");
},
start: function (e, data) {
$(".photothumb-wapper").append('<div class="photothumb photoprogress" style="border:none"><img src="/assets/ajax-loader.gif" /></div>');
}, …Run Code Online (Sandbox Code Playgroud) javascript http-headers internet-explorer-9 blueimp jquery-file-upload
在Backbone模型中,我们有url和urlRoot属性:
url: function(){
return '/jobs'
},
urlRoot: function () {
return '/jobs'
},
Run Code Online (Sandbox Code Playgroud)
但是我想在URL中添加params或查询参数,具体取决于GET,POST,PUT,DELETE等请求的类型.
所以我想做这样的事情:
url: function(type, opts){ //type and opts arguments are not available in Backbone, I just made them up for this example
var url = '/jobs';
switch (type) {
case 'GET':
break;
case 'POST':
break;
case 'PUT':
url = url + '?optimisticDelete=' + opts.optimisticDelete;
break;
case 'DELETE':
url = url + '?upsert=' + opts.upsert;
break;
default:
throw new Error('no match');
}
return url;
},
Run Code Online (Sandbox Code Playgroud)
有没有一个很好的方法来完成这样的事情?
几天后我一直被困在这个问题上.我想在jQuery.load()中发送一些头文件数据.似乎jQuery.load从不发送标头,如ajax.有人可以解释如何,或者是否有必要?顺便说一下,我的英语不好.
这是语法:
$loadingBay.load(href, settings.data, function (data, status) {
prep(status === 'error' ? $tag(div, 'Error').html(settings.xhrError) : $(this).contents());
});
Run Code Online (Sandbox Code Playgroud)
非常感谢
javascript ×5
jquery ×5
ajax ×4
cors ×2
http-headers ×2
asp.net ×1
backbone.js ×1
blueimp ×1
c# ×1
ember-data ×1
ember.js ×1
jwt ×1
post ×1
vue.js ×1
wcf ×1