0

当我尝试使用 PHP cURL 将此 XML 文档发布到 Blackboard Learn LIS 时,我收到此错误。我正在使用 simplexml 检查 XML 以确保它格式正确,所以这不是问题。我还检查了 XML 文档以确保没有附加 BOM 数据。我已经在十六进制编辑器中打开它以确保这一点。

我完全被这个难住了,我无法访问 Blackboard 日志。

PHP:

include("xml/envelope.php");

//sanity check to see if xml is well formed
    $sxml = simplexml_load_string($xml);

    $xml = $sxml->asXML();

    $xml_length = strlen($xml);

    $url = $this->lis_outcome_service_url;

    $bodyHash = base64_encode(sha1($xml, TRUE)); // build oauth_body_hash
    $consumer = new OAuthConsumer($key, $secret);
    $request = OAuthRequest::from_consumer_and_token($consumer, '', 'POST', $url, array('oauth_body_hash' => $bodyHash) );
    $request->sign_request(new OAuthSignatureMethod_HMAC_SHA1(), $consumer, '');
    $header = $request->to_header() . "Content-Type: application/xml\r\nContent-Length: $xml_length\r\n"; // add content type header

    $ch = curl_init($url);

    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array($header));
    //curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_POST, 1);
    //curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
    //curl_setopt($ch, CURLOPT_FAILONERROR, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    $output = curl_exec($ch);
    $output .= "$url<br><br>$output<pre>$header\n\n".htmlspecialchars($xml)."</pre><p>ERRORS?: ".curl_error($ch); 
    curl_close($ch);// "<p>Saved grade: "+var_export($output)+"</p>";
    return $output;

信封.php 中的 XML:

<?php
$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<imsx_POXEnvelopeRequest xmlns="http://www.imsglobal.org/services/ltiv1p1/xsd/imsoms_v1p0">
    <imsx_POXHeader>
            <imsx_POXRequestHeaderInfo>
                    <imsx_version>V1.0</imsx_version>
                    <imsx_messageIdentifier>$id</imsx_messageIdentifier>
            </imsx_POXRequestHeaderInfo>
    </imsx_POXHeader>
    <imsx_POXBody>
            <replaceResultRequest>
                    <resultRecord>
                            <sourcedGUID>
                                    <sourcedId>$this->lis_result_sourcedid</sourcedId>
                            </sourcedGUID>
                            <result>
                                    <resultScore>
                                            <language>en-us</language>
                                            <textString>0.7</textString>
                                    </resultScore>
                            </result>
                    </resultRecord>
            </replaceResultRequest>
    </imsx_POXBody>
</imsx_POXEnvelopeRequest>
XML;
?>

解析后浏览器中的 XML 输出(在 cURL 请求期间):

<?xml version="1.0" encoding="UTF-8"?>
<imsx_POXEnvelopeRequest xmlns="http://www.imsglobal.org/services/ltiv1p1/xsd/imsoms_v1p0">
    <imsx_POXHeader>
            <imsx_POXRequestHeaderInfo>
                    <imsx_version>V1.0</imsx_version>
                    <imsx_messageIdentifier>53e4657ec1499</imsx_messageIdentifier>
            </imsx_POXRequestHeaderInfo>
    </imsx_POXHeader>
    <imsx_POXBody>
            <replaceResultRequest>
                    <resultRecord>
                            <sourcedGUID>
                                    <sourcedId>bbgc15659375gi290156</sourcedId>
                            </sourcedGUID>
                            <result>
                                    <resultScore>
                                            <language>en-us</language>
                                            <textString>0.7</textString>
                                    </resultScore>
                            </result>
                    </resultRecord>
            </replaceResultRequest>
    </imsx_POXBody>
</imsx_POXEnvelopeRequest>   
4

1 回答 1

0

由于关于如何在 LTI 中执行此操作的详细信息很少,我在下面发布了我的解决方案。这是我添加到 Blackboard 的 EduGarage 论坛的副本,但为了将其纳入公共领域,我将其放在这里。我希望它可以帮助其他尝试实施 LTI 工具的人。

以下是使用 PHP cURL 传回成绩的方法,envelope.php 文件的内容应
遵循此处的 IMS 全球文档中的 XML 。cURL 请求构造标头,然后在其下方添加 XML 正文。请注意,信封.php 文件包含以下格式的 $xml 变量(您显然需要添加自己的 $id 并使用变量设置等级等...):

PHP 中的 POX XML 用于替换 LMS 中的用户等级

使用 cURL 通过等级的 PHP 代码:

包括(“xml/信封.php”);

        $xml_length = strlen($xml);

        $url = $this->lis_outcome_service_url;

        $bodyHash = base64_encode(sha1($xml, TRUE)); // 构建 oauth_body_hash
        $consumer = new OAuthConsumer($key, $secret);
        $request = OAuthRequest::from_consumer_and_token($consumer, '', 'POST', $url, array('oauth_body_hash' => $bodyHash) );
        $request->sign_request(new OAuthSignatureMethod_HMAC_SHA1(), $consumer, '');
        $header .= $request->to_header(); // 添加内容类型头

        $ch = curl_init($url);

        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array("POST http://your-tools-url-here.edu.au HTTP/1.0",
                                                    “内容长度:$xml_length”,$header,“内容类型:应用程序/xml”));
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        $output = curl_exec($ch);
        curl_close($ch);

 

于 2014-08-11T01:53:37.937 回答