是否可以使用某种JavaScript来更改或设置HTTP请求的标头?
我有一个iPhone的Web应用程序,它最终将在PhoneGap应用程序中运行 - 但是现在我在Safari中运行它.
该应用程序需要访问Twitter朋友的推文,包括私人推文.所以我使用Scribe库实现了OAuth.我成功地将用户反弹到Twitter,让他们进行身份验证,然后反弹.
此时,Web应用程序具有oAuth凭据(密钥和令牌),它在本地持久存在.从这里开始,我希望用户使用Twitter状态/ user_timeline.json方法来获取特定用户的推文.我有使用JSONP请求的应用程序成功执行此操作与未受保护的推文; 当它访问私人Twitter提要的时间轴时,应用程序中会出现HTTP基本身份验证对话框.
我相信我需要向Twitter提供OAuth凭据,以便我的Web应用程序可以识别和验证自己.Twitter建议通过添加HTTP Authorization标头来实现,但由于我正在使用JSONP请求,我认为这不是我的选择.我是否正确地假设这个?
因此,我的选项似乎是将oAuth凭证作为查询字符串参数(Twitter建议反对,但文档建议仍然支持); 或通过中间服务器代理所有推文.我宁愿避开后者.
我使用表单的URL访问Twitter API
当user_id是公共用户时,这可以正常工作.当user_id是私人用户时,我会获得HTTP Basic Auth对话框.知道我做错了什么吗?我希望它像"忘记一个重要的参数"一样令人尴尬地简单......
我正在尝试使用AngularJS从幻想数据API获取信息.我使用$ resource在我的控制器中执行我的get请求,但是我无法弄清楚如何正确地包含API密钥.我是否需要将其作为标题包含在内?谢谢.
nflApp.controller('mainController', ['$scope','$resource','$routeParams', function($scope, $resource, $routeParams) {
$scope.fantasyAPI = $resource("https://api.fantasydata.net/nfl/v2/JSON/DailyFantasyPlayers/2015-DEC-28", { callback: "JSON_CALLBACK" }, { get: { method: "JSONP"}});
console.log($scope.fantasyAPI);
}]);
Run Code Online (Sandbox Code Playgroud)
以下是该站点的http请求信息. 
由于您无法在JSONP调用上应用自定义标头,如何使用jQuery创建跨域请求并应用自定义标头?
我基本上试图使用jQuery访问谷歌文档,并需要传递身份验证令牌:
var token = "my-auth-token";
$.ajax({
url: "http://docs.google.com/feeds/documents/private/full?max-results=1&alt=json",
dataType: 'json',
beforeSend: function(xhr) {
xhr.setRequestHeader("Authorization", "GoogleLogin auth=" + token);
},
success: function(data, textStatus, XMLHttpRequest) {
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
}
});
Run Code Online (Sandbox Code Playgroud)
注意:这样做的目的是完全绕过应用程序层.使用ruby连接到Google Data API很简单,但是它会占用很多资源,一直在服务器端解析Feed.
我正在试图弄清楚如何使用jQuery对ASMX Web服务进行JSONP调用.这些只是我已经阅读过的一些页面,但没有找到任何解决方案:
使用JQuery访问ASP.net webservice时出错 - JSONP
http://www.codeproject.com/Articles/43038/Accessing-Remote-ASP-NET-Web-Services-Using-JSONP
http://encosia.com/using-jquery-to-consume-aspnet-json-web-services/
等等...
这是我的示例.NET Web方法:
[WebMethod]
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
public void GetEmployee(string employeeId, string callback)
{
// Get the employee object from the Factory.
Employee requestedEmployee = EmployeeFactory.GetEmployee(employeeId);
if(requestedEmployee != null)
{
// Return the padded JSON to the caller.
CrossDomainUtility.SendJsonP(callback, requestedEmployee.ToJson());
}
}
Run Code Online (Sandbox Code Playgroud)
这是SendJsonP():
public static void SendJsonP(string callback, string json)
{
// Clear any response that has already been prepared.
HttpContext.Current.Response.Clear();
// Set the content type …Run Code Online (Sandbox Code Playgroud) 我编写了以下控制器,用于使用Angular JS测试HTTP Basic Auth.
function TestCtrl($scope, $http, Base64){
$http.defaults.headers.common.Authorization = 'Basic ' + Base64.encode('admin:secret');
$http.jsonp( 'http://localhost:5000/test'+'/?callback=JSON_CALLBACK', {query:{isArray:true }}).
then(function (response) {
$scope.test = response.data;
});
}
Run Code Online (Sandbox Code Playgroud)
我可以看到当我设置标题时console.log($http.defaults.headers).但是,当我在Firefox中使用Chrome开发者工具栏或Firebug检查请求标头时,我看不到授权标头.
接收请求的服务器未获得Authorization标头.
我在这里做错了什么?
这是一个非常简单的例子,用于调用Twitter的搜索API,以便从已知有推文的标签中获取所有推文#fml.
我相信我正确使用了此处所述的仅应用程序身份验证:https://dev.twitter.com/docs/auth/application-only-auth(有关呼叫,请参阅步骤3)
我被要求提供一个不涉及任何服务器端代码的解决方案,所以我在javascript中包含了承载代码,这不好开头,但....
我希望这段代码能够运行.相反,它产生错误'400(错误请求)'.有任何想法吗?
$.ajax({
url: "https://api.twitter.com/1.1/search/tweets.json",
dataType: "jsonp",
data: "q=%23fml",
beforeSend: function (xhr) {
xhr.setRequestHeader ("Authorization", "Bearer XXmyBearerCodeXX");
},
success: function(json){ alert(json); }
});
Run Code Online (Sandbox Code Playgroud)
编辑1 - 验证的Twitter电话
使用hurl.eu我能够通过上面的查询和授权标题从API获得成功的响应,所以我认为这意味着我的Twitter调用是正确的,只是没有在jQuery.ajax()中正确设置,但我只是不喜欢看不出什么.
我正在尝试使用需要调用的API来获取具有基本HTTP身份验证的Json.我用javascript并不精彩.
我的代码是:
<script type="text/javascript">
$.getJSON({
'url': 'http://data.unistats.ac.uk/api/KIS/Institutions.JSON?pageIndex=1&pageSize=25',
'beforeSend': function(xhr) {
xhr.setRequestHeader("Authorization",
"Basic " + encodeBase64("ABCDEF" + ":" + password));
},
success: function(result) {
alert('done');
},
error: function(result) {
alert('no');
}
});
</script>
Run Code Online (Sandbox Code Playgroud)
我希望这可以称之为成功或错误之一.因此输出应该是警告说"完成"或警告说"不".甚至是开发人员控制台中的错误告诉我出了什么问题.
我没有得到任何东西,也没有警报显示,我在控制台中没有错误.有什么想法在这里发生了什么?
谢谢,
编辑:使用firebug我看到请求标题是:请求标题显示为:
OPTIONS /api/KIS/Institutions.JSON?pageIndex=1&pageSize=25 HTTP/1.1
Host: data.unistats.ac.uk
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0
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
Origin: null
Access-Control-Request-Method: GET
Access-Control-Request-Headers: authorization
Connection: keep-alive
Run Code Online (Sandbox Code Playgroud)
这似乎不正确,因为它应该是:授权:基本TheSecurityKey
响应是405,方法不允许重新加载页面以获取源代码:http://data.unistats.ac.uk/api/KIS/Institutions.JSON?pageIndex = 1&pageSize = 25
响应标头:
HTTP/1.1 405 Method Not Allowed …Run Code Online (Sandbox Code Playgroud)