3

nodejs と REST API を使用して bigquery とやり取りしています。JWT 署名に google-oauth-jwt モジュールを使用しています。

サービス アカウントに書き込み権限を付与しました。これまでのところ、プロジェクトの一覧表示、データセットの一覧表示、テーブルの作成、およびテーブルの削除を行うことができます。しかし、マルチパート POST 経由でファイルをアップロードする場合、2 つの問題に遭遇しました。

  • gzip された json ファイルが機能しません。「終了境界がありません」というエラーが表示されます
  • 圧縮されていない json ファイルを使用すると、401 無許可エラーが発生します

他の REST API 呼び出しが期待どおりに機能したため、これは私のマシンの時刻が同期していないことに関連しているとは思いません。

var url = 'https://www.googleapis.com/upload/bigquery/v2/projects/' + projectId + '/jobs';
    var request = googleOauthJWT.requestWithJWT();
    var jobResource = {
        jobReference: {
            projectId: projectId,
            jobId: jobId
        },
        configuration: {
            load: {
                sourceFormat: 'NEWLINE_DELIMITED_JSON',
                destinationTable: {
                    projectId: projectId,
                    datasetId: datasetId,
                    tableId: tableId
                },
                createDisposition: '',
                writeDisposition: ''
            }
        }
    };
    request(
            {
                url: url,
                method: 'POST',
                jwt: jwtParams,
                headers: {
                    'Content-Type': 'multipart/related'
                },
                qs: {
                    uploadType: 'multipart'
                },
                multipart: [
                    {
                        'Content-Type':'application/json; charset=UTF-8',
                        body: JSON.stringify(jobResource)
                    },
                    {
                        'Content-Type':'application/octet-stream',
                        body: fileBuffer.toString()   
                    }
                ]
            },
            function(err, response, body) {
                console.log(JSON.parse(body).selfLink);
            }
        );

誰でもこれに光を当てることができますか?

PS bigquery REST API のドキュメントは多くの点で最新ではありません。

更新 1:

完全な HTTP 要求は次のとおりです。

POST /upload/bigquery/v2/projects/239525534299/jobs?uploadType=multipart HTTP/1.1
content-type: multipart/related; boundary=71e00bd1-1c17-4892-8784-2facc6998699
authorization: Bearer ya29.AHES6ZRYyfSUpQz7xt-xwEgUfelmCvwi0RL3ztHDwC4vnBI
host: www.googleapis.com
content-length: 876
Connection: keep-alive

--71e00bd1-1c17-4892-8784-2facc6998699
Content-Type: application/json

{"jobReference":{"projectId":"239525534299","jobId":"test-upload-2013-08-07_2300"},"configuration":{"load":{"sourceFormat":"NEWLINE_DELIMITED_JSON","destinationTable":{"projectId":"239525534299","datasetId":"performance","tableId":"test_table"},"createDisposition":"CREATE_NEVER","writeDisposition":"WRITE_APPEND"}}}
--71e00bd1-1c17-4892-8784-2facc6998699
Content-Type: application/octet-stream

{"practiceId":2,"fanCount":5,"mvp":"Hello"}
{"practiceId":3,"fanCount":33,"mvp":"Hello"}
{"practiceId":4,"fanCount":71,"mvp":"Hello"}
{"practiceId":5,"fanCount":93,"mvp":"Hello"}
{"practiceId":6,"fanCount":92,"mvp":"Hello"}
{"practiceId":7,"fanCount":74,"mvp":"Hello"}
{"practiceId":8,"fanCount":100,"mvp":"Hello"}
{"practiceId":9,"fanCount":27,"mvp":"Hello"}

--71e00bd1-1c17-4892-8784-2facc6998699--
4

2 に答える 2

0

重複content-typeしたヘッダーを Google API に送信している可能性があります。

テストのために Google BigQuery に簡単にリクエストを送信する機能はありませんが、headersオプション オブジェクトのプロパティを に削除することから始めますrequest()

これを削除します:

headers: {
  'Content-Type': 'multipart/related'
},

Node.jsrequestモジュールは、マルチパート配列で渡されたことを自動的に検出し、適切な content-type ヘッダーを追加します。独自の content-type ヘッダーを提供すると、マルチパート境界を含まない「重複」ヘッダーになる可能性が高くなります。

コードを少し変更して、送信された実際のヘッダーを出力すると、次のようになります。

var req = request({...}, function(..) {...});

console.log(req.headers);

上記の元のコードでは、次のように表示されるはずです (私は Node REPL を使用しています)。

> req.headers
{ 'Content-Type': 'multipart/related',
  'content-type': 'multipart/related; boundary=af5ed508-5655-48e4-b43c-ae5be91b5ae9',
  'content-length': 271 }

headersまた、明示的なオプションを削除すると、次のようになります。

> req.headers
{ 'content-type': 'multipart/related; boundary=49d2371f-1baf-4526-b140-0d4d3f80bb75',
  'content-length': 271 }

一部のサーバーは、同じ名前を持つ複数のヘッダーをうまく処理できません。これにより、API からの終了境界の欠落エラーが解決されることを願っています!

于 2013-08-08T06:13:04.320 に答える