我正在尝试构建一个Delphi XE2 DataSnap Rest服务器,用作第三方API以访问我们的DBMS。
我已经扩展了在xe2中使用rest datasnap向导并提供身份验证和授权时提供的示例方法的功能。
我可以确认我写的所有服务器方法都会传回直接通过浏览器访问的数据。
问题来自尝试从$ .ajax()调用验证服务器。
从浏览器地址栏访问时,系统会提示您输入用户名和密码,当您为两者输入“dev”时,可以继续。
将ajax()用户名和密码params设置为“dev”时,我收到了HTTP 401响应。
我认为我正确地做到了,但这里是代码片段:
$("#contentdiv").click(function(){
$.ajax({
type:"GET",
cache:"false",
username:"dev",
password:"dev",
url:"http://192.168.0.2:8080/datasnap/rest/TServerMethods1/methodname/",
dataType:"jsonp",
statusCode: {
200: function(data){
alert('success ');
}
}
});
});
如果我关闭身份验证,我可以成功获得HTTP 200响应(尽管JSON Delphi DataSnap中的语法错误正在返回,但这是一个不同时间的问题。)
另外,值得知道的是 - 如果我手动登录然后运行ajax,它可以工作 - 我假设这是因为凭据被缓存或者其他一些。
这两种技术都是新手,所以请保持温和。 如果我遗漏了可能有意义的东西,请告诉我,我会在这里解决。
答案 0 :(得分:0)
您的Ajax代码使用JSONP,服务器使用基本的身份验证。
对this answer的评论说JSONP不能包含Basic Auth要求的USER / PWD标题:
Basic Authentication with jQuery.ajax request and jsonp
原因是(引用上面的答案):
JSONP的工作方式不同,它是通过标签包含的GET请求 获取文件,因此您不会发送特殊标题或任何内容。