1

我尝试了几种不同的方法来使用我的 xml 发送 POST 请求,以向我的谷歌自定义搜索添加注释。我尝试过的每种不同方法都会导致 HTTP 411 错误(POST 请求需要 Content-length 标头)。这是我当前的代码:

    <?php
    $ch = curl_init();
    $url = 'https://www.google.com/accounts/ClientLogin?accountType=HOSTED_OR_GOOGLE&Email=****&Passwd=*****&service=cprose&source=ednovo-classadmin-1';
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $authTokenData = curl_exec($ch);
    $authTokenArray = explode('Auth=', $authTokenData);
    $authToken = $authTokenArray[1];

    echo "got token: $authToken<br>";

    $annotation = $_POST['annotation'];
    $label = $_POST['label'];
    $href = $_POST['href'];
    curl_close($ch);
    $data ='<Batch>' .
                '<Add>' .
                    '<Annotations>' .
                        '<Annotation about = "' . $annotation . '">' .
                            '<Label name = "' . $label . '" />' .
                        '</Annotation>' .
                    '</Annotations>' .
                '</Add>' .
            '</Batch>';
   $url = "http://www.google.com/cse/api/default/annotations/";
    curl_setopt($ch, CURLOPT_URL, $url);
    $length = strlen($data);
    $header = array("Authorization: GoogleLogin auth=" . $authToken, "Content-Type: text/xml","Content-Length: " . $length);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $result = curl_exec($ch);

    if ( curl_errno($ch) ) {
    $result = 'cURL ERROR -> ' . curl_errno($ch) . ': ' . curl_error($ch);
} else {
    $returnCode = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE);
    switch($returnCode){
        case 200:
            break;
        default:
            $result = 'HTTP ERROR -> ' . $returnCode;
            break;
    }
}

    echo $result;
?>

我很感激这方面的任何帮助。

谢谢你。


感谢您的帮助,因为这是我的问题之一。但是,即使在使用 init 并更改标头之后,它仍然给我相同的 HTTP 411 错误。你还有其他建议吗?谢谢一堆。

4

2 回答 2

1

curl_close($ch);在第一次请求 ClientLogin 后调用了,但您忘记$ch = curl_init();为第二次请求再次调用。添加您不需要放置 Content-Length 标头字段;curl 在设置帖子字段/数据时自动填充它。您还可以尝试在 Authorization 字段中的 auth 值上添加引号。

$header = array('Authorization: GoogleLogin auth="'. $authToken.'"', "Content-Type: text/xml");

在发布您的代码时,请务必删除您的 Google Apps 登录凭据。

于 2011-06-10T05:16:48.577 回答
0

这不应该是 [0] 吗?也许不是,只是一个建议。

 $authToken = $authTokenArray[1];

仍在努力为您解决....

于 2011-06-10T00:19:39.070 回答