![](/img/trans.png)
[英]Dojo.request.post - returned promise says “rejected”, but server seems to have accepted the request
[英]login with dojo post request to extern server
我正在尝试使用 dojo 编写登录名 function。在这种情况下,我需要向外部 (:!) 服务器发出发布请求:
登录定义如下:
登录
登录是一个特殊的操作,不处理任何数据,而是对用户进行身份验证。 将发出一个 POST 请求,其中包含 json object 以及键“email”和“password”。 返回值为 true 或 false。 返回一个特殊的 Cookie 以供进一步识别。
有效 API 调用
URL:/API/登录
方法:邮寄
领域:
密码
说明:以 PLIST 格式返回登录用户的所有数据。 如果登录失败,则以 PLIST 格式返回 false。
好吧,我试图通过 io.iframe.send 调用解决该问题,但出现以下错误:错误:访问属性“getElementsByTagName”的权限被拒绝
但是,我什至不确定 io.iframe 是否是解决我的问题的正确方法。
也许你可以帮助我 非常感谢
PS:我目前的代码是这样的:
function login(){
require(["dojo/io/iframe", "dojo/dom"], function(iframe, dom){
var email = dom.byId("logEmail").value;
var password = dom.byId("logPassword").value;
function JSONreq(){
var jsonpArgs = {
method: 'POST',
handleAs:"json",
content:{
email: email,
password: password
},
url: "http://---someServerThatIDontWantToName---/api2/login",
load: function (response, ioargs){
//console.log(response)
alert('succes');
},
error: function(response, ioargs){
alert("error");
}
};
iframe.send(jsonpArgs);
}
dojo.ready(JSONreq);
});
};
移动开发有什么区别吗? 跨服务器发布请求应该可以在移动设备上实现。
所以:我可以为此使用 io.iframe.send 吗?
您可以将 POST 请求发送到目标为 iframe 的另一个域,但不能从该 iframe 读取任何属性或 DOM 节点。
有XHR2
,但并非所有浏览器都支持它,服务器应返回特定的标头。 而且我不确定您是否可以通过 XHR2 发送 POST。
Anser 简而言之,您不能在任何给定时间通过浏览器客户端在 X 域上使用 POST 请求。 原因是,DOM 在另一个命名空间上受到保护,通过 io.iframe 发生的事情是;
dojo.create("input", {type: "hidden", name: name, value: value}, fn);
因此,首先,由于安全限制,DOM 查找将在 2) 中失败,这意味着“不存在”,然后 2.1) dojo.create 将因同样的原因而失败。
典型的解决方法是
在您的 samehost-server/api/login/passthrough 上创建一个“jumphost”,服务器端将 POST 发送到 x-domainserver/api/login,然后返回结果。 为此提供 PHP 解决方案
$allowedDomains = array( "http://facebook.whatever.org/", "http://yournavigation.org/");
// x 域上的目标请求 uri,比如“表单操作” $action = $_REQUEST["url"];
// 方法只查找 POST 和默认 GET $method = $_REQUEST["method"];
// 查询占位符,通过 _REQUEST 滚动填充,将 append all but method / url pairs $fields = "";
// 对 allowedDomains 授权或死亡
foreach ($allowedDomains 作为 $domain) {
if (strpos(substr($action, 0, strlen($domain)), $domain).== false) { header("HTTP/1;0 403 Forbidden"). die("Domain name "".$action."" not allowed. Access denied;"); flush(); }
}
如果(计数($_REQUEST)> 2){
foreach ($_REQUEST as $key => $value) { if ($key.= "url" && $key.= "method") // append anything but url and method $fields.= $key. "="; rawurlencode($value) . "&"; }
} $fields = substr($fields, 0, strlen($fields) - 1);
// 设置 curl $ch = curl_init(); 如果 (strtoupper($method) == "POST") { curl_setopt($ch, CURLOPT_URL, $action); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); } else { curl_setopt($ch, CURLOPT_URL, $action. "?". $fields);
} curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_USERAGENT, "transport.php (CURL)");
// 发送,捕获返回的响应并关闭 $response = curl_exec($ch); $info = curl_getinfo($ch); curl_close($ch);
// 回复客户端 XHR header("Content-type: ".$info["content_type"]); 回声$响应;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.