1

我正在尝试构建一个 Delphi XE2 DataSnap Rest 服务器,用作访问我们 DBMS 的第 3 方 API。

我已经扩展了在 xe2 中使用带有身份验证和授权的 rest datasnap 向导时提供的示例方法的功能。

我可以确认,我编写的所有服务器方法在直接通过浏览器访问时都会传回预期的数据。

问题来自尝试通过 $.ajax() 调用对服务器进行身份验证。

从浏览器地址栏访问时,系统会提示您输入用户名和密码,当您同时输入“dev”时,您可以继续。

将 ajax() 用户名​​和密码参数设置为“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,它可以工作 - 我假设这是因为凭据被缓存或类似的。

这两种技术都很新,所以要温柔。如果我遗漏了一些可能很重要的东西,请告诉我,我会在这里找到它。

4

1 回答 1

0

您的 Ajax 代码使用 JSONP,服务器使用基本身份验证。

对此答案的评论说 JSONP 不能包含基本身份验证所需的 USER / PWD 标头:

使用 jQuery.ajax 请求和 jsonp 进行基本身份验证

原因是(引用上面的答案):

JSONP 的工作方式不同,它是通过标签包含的 GET 请求来获取文件,因此您不会发送特殊的标头或任何东西。

于 2012-07-13T15:04:13.697 回答