0

Gimbal manager Restful API に接続しようとしています。組織用のアカウントと API キーを持っています。API エンドポイントからの 401 無許可の応答で、cURL 要求が失敗し続けます。PHPでの私のcURLリクエストは次のとおりです。

    // from Gimbal Manager:
    define('ORG_API_KEY', 'XXXXXXXXXXXXXXXXX') ;

    // new beacon registration object:
    $post = array (
        "factory_id" => "XXXX-XXXXX",
        "name" => "NewBeacon",
        "latitude" => 12345
        "longitude" => 67890,
        "visibility" => "public"
    );

    $url = "https://manager.gimbal.com/api/beacons";
    $headers = array(
          'AUTHORIZATION: Token token=' . ORG_API_KEY, 
          'Content-type: application/json'
    ) ;
    $debug = 1 ;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers, TRUE);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    if ($debug) {
        curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
        curl_setopt($ch, CURLOPT_HEADER, TRUE);
        curl_setopt($curl, CURLINFO_HEADER_OUT, true);
    }

    curl_setopt($crl, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($crl, CURLOPT_SSL_VERIFYPEER, false);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

    $result = curl_exec($ch);

(編集)そしてここにリクエストヘッダー(上記の $headerSent 変数から)

POST /api/beacons HTTP/1.1
Host: manager.gimbal.com
Accept: */*
Content-Length: 577
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------ce1a4e9dd55e

ジンバルからの応答は次のとおりです。

HTTP/1.1 401 Unauthorized
Cache-Control: no-cache
Content-Type: text/html; charset=utf-8
Date: Sat, 29 Aug 2015 20:05:10 GMT
Server: Apache
Status: 401 Unauthorized
Vary: Accept-Encoding
WWW-Authenticate: Token realm="Application"
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-Request-Id: 7abe53cd-d161-4886-bb61-8cfedf71743a
X-XSS-Protection: 1; mode=block
Content-Length: 27
Connection: keep-alive
HTTP Token: Access denied.

AUTH トークンを表現するいくつかの異なる方法を試しました。

AUTHORIZATION: <$token>
AUTHORIZATION: Token <$token>
AUTHORIZATION: Token token=<$token>

それらはすべて同じ 401 応答を返します。ここや他の場所で同様の問題を説明している他のチケットに気付きましたが、解決済みとしてマークされたものはありませんでした。

Gimbal Manager API との接続に成功した人はいますか? もしそうなら、あなたのコードは違って見えましたか?

4

1 に答える 1

0

最終的に、上記の最初のコードで 2 つの問題が発生しました。

CURLOPT_HTTPHEADER の TRUE フラグは、AUTH/Content-type ヘッダーの送信を妨げていました (なぜそこにあるのか、そのフラグに値や意味があるのか​​どうかはわかりません)。

一緒に送った POST データの形式が正しくありませんでした。JSON のコンテンツ タイプを要求していたので、POST データがその形式であることが期待されていました。json_encode($post) を追加すると、すべてが正常に機能しました。

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers, TRUE);
.. .became ....
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

and

curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
... became ....
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post));

コードの欠陥を見つけて自分で解決するには、大きな StackOverflow の問題を慎重に入力してフォーマットする必要がある場合があります。:)

于 2015-08-29T20:47:24.137 に答える