【问题标题】:using curl and json to return a token使用 curl 和 json 返回一个令牌
【发布时间】:2013-11-14 19:30:06
【问题描述】:

站点 A 有我所有的 php 类和函数:

这是我的操作 (profile.php) 页面 SITEA 中的内容:

$shopper = new Shopper($email);
$shopper->login($password);

$cInit = curl_init("http://siteA/test/login");
curl_setopt_array($cInit, array(
    CURLOPT_RETURNTRANSFER=>true,
    CURLOPT_POST=>true,
    CURLOPT_POSTFIELDS=>urlencode(implode("&", array("email" => $email, "password" => $password)))
    ));

    $content = curl_exec($cInit);
    $err     = curl_errno($cInit);
    $errmsg  = curl_error($cInit);

    $results = json_decode($content)
?>

站点 B 托管在具有表单和卷曲选项的不同服务器上:

$email = $_POST['email'];
$password = $_POST['password'];

$shopper = new Shopper();
$token = $shopper->login($email, $password);

echo json_encode(array("token" => $token)); 

<form id='register' action='http://siteA/test/profile' onsubmit="return validateForm()" method='post' accept-charset='UTF-8'>
    <fieldset>
    <legend>Log In</legend><br/>
    <label for='email' >Email Address*:</label>
    <input type='text' name='email' id='email' maxlength="50" /><br/><br/>
    <label for="password">Password*:</label>  
    <input type="password" name="password" placeholder="password" required><br/><br/>
    <input type='submit' name='Submit' value='Submit' />
    </fieldset>
    </form>

令牌一直返回 false,到目前为止我的代码看起来是否正确?

【问题讨论】:

  • 我想真正的问题是......在$cInit = curl_init("");...里面是不是假设要回到登录页面?
  • 站点 a 有 $shopper = new Shopper($email);,但 B 有 $shopper = new Shopper();。参数是问题的区别吗?
  • curl_init("") set's curl opt CURLOPT_URL |也就是说,这是它所追求或获取的 url
  • 那么url一定要指向登录页面吗?
  • 它也需要指出您发布信息的位置。因此,如果您的登录还包含发布功能(不是一个好习惯),那么可以。但是,如果您期望通过另一个页面上的其他函数运行您的 POST 变量,那么不会。在您的情况下,您发布的是emailpassowrd,这意味着您也希望拥有$_POST['email'] 的任何页面“卷曲”

标签: php json curl


【解决方案1】:

不是答案 |可能有助于评估问题


我还不确定,只是看看我所看到的并与您交谈,但也许这可以帮助您评估。下面的代码 sn-p 会让你在某种程度上更容易评估正在发生的事情。使用就像var_dump 一样简单,但结果在浏览器中更容易阅读,因为它只需要您的转储并在​​其周围放置一些漂亮的 HTML。它还接受与您输入的参数一样多的参数,因此可以轻松地一次评估多个变量。

function preDump() {    //  use string "noEcho" to just get a string return only
    $args = func_get_args();
    $doEcho = TRUE; $sb;
    if ($args) {
        $sb = '<div style="margin: 1em 0;"><fieldset style="display:inline-block;padding:0em 3em 1em 1em;"><legend><b>preDump: '.count($args).' Parameters Found.</b></legend>';
        foreach (func_get_args() as $arg) {
            if (gettype($arg) == 'string') if ($arg == 'noEcho') { $doEcho = FALSE; $sb = preg_replace('/(preDump: )[0-9]+/', 'preDump: '.(count($args)-1), $sb); continue; }
            $sb .= '<pre data-type="'.gettype($arg).'"';
            switch (gettype($arg)) {
                case "boolean":
                case "integer":
                    $sb .= ' data-dump="json_encode"><p style="border-bottom:1px solid;margin:0;padding:0 0 0 1em;"><b>gettype('.gettype($arg).')</b></p><p>';
                    $sb .= json_encode($arg);
                    break;
                case "string":
                    $sb .= ' data-dump="echo"><p style="border-bottom:1px solid;margin:0;padding:0 0 0 1em;"><b>gettype('.gettype($arg).')</b></p><p>';
                    $sb .= $arg;
                    break;
                default:
                    $sb .= ' data-dump="var_dump"';
                    if (is_object($arg)) $sb .= 'data-class="'.get_class($arg).'"';
                    $sb .= '><p style="border-bottom:1px solid;margin:0;padding:0 0 0 1em;"><b>gettype('.gettype($arg).')';
                    if (is_object($arg)) $sb .= ' ['.get_class($arg).']';
                    $sb .= '</b></p><p>';
                    ob_start();
                    var_dump($arg);
                    $sb .= ob_get_clean();
                    if (ob_get_length()) ob_end_clean();
            }
            $sb .= '</p></pre>';
        }
        $sb .= '</fieldset></div>';
    }
    else {
        $sb = '<div style="margin: 1em 0;"><fieldset style="display:inline-block;"><legend><b>preDump: [ERROR]</b></legend><h3>No Parameters Found</h3></fieldset></div>';
    }
    if ($doEcho) echo($sb);
    return $sb;
}

我建议这样做,因为我觉得这里缺少更多代码,并且您在 2 个不同的服务器上运行 2 个差异。因此,您可以按如下方式使用它:

网站 A

function preDump() { ... }

$shopper = new Shopper($email);
$shopper->login($password);

//  Maybe go ahead and test your results of shopper here
preDump($shopper); return;

$cInit = curl_init("http://siteA/test/login");
curl_setopt_array(
    $cInit,
    array(
        CURLOPT_RETURNTRANSFER=>true,
        CURLOPT_POST=>true,
        CURLOPT_POSTFIELDS=>urlencode(implode("&", array("email" => $email, "password" => $password)))
    )
);

$content = curl_exec($cInit);
$err     = curl_errno($cInit);
$errmsg  = curl_error($cInit);

$results = json_decode($content)
//  or, remove that line i put up above and test your results here
preDump($results); return;

//  you can even get the preDump results as a string and then echo as you see fit
$bob = preDump($results, 'noEcho'); //  string of 'noEcho' will cause the results to return as a string not be echoed into browser 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 2015-04-13
    • 2020-04-16
    相关资源
    最近更新 更多