【问题标题】:Invalid Upload Request上传请求无效
【发布时间】:2019-12-03 18:27:55
【问题描述】:

我在尝试使用 Google API Client libraries for Go 将数据上传到 BigQuery 时收到以下响应。

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "badRequest",
    "message": "Invalid Upload Request"
   }
  ],
  "code": 400,
  "message": "Invalid Upload Request"
 }
}

我的工作描述如下:

j := &bigquery.Job{
    Configuration: &bigquery.JobConfiguration{
        Load: &bigquery.JobConfigurationLoad{
            DestinationTable: &bigquery.TableReference{
                projectId,
                "xyz",
                name + "_" + yyyymmdd,
            },
            SkipLeadingRows: 1,
            FieldDelimiter:  "|",
            MaxBadRecords:   3,
            Schema: &bigquery.TableSchema{
                []*bigquery.TableFieldSchema{
                    {Name: "f1", Type: "STRING"},
                    {Name: "f2", Type: "STRING"},
                    {Name: "f3", Type: "STRING"},
                    {Name: "f4", Type: "STRING"},
                    {Name: "f5", Type: "STRING"},
                    {Name: "f6", Type: "STRING"},
                    {Name: "f7", Type: "STRING"},
                    {Name: "f8", Type: "STRING"},
                    {Name: "f9", Type: "STRING"},
                    {Name: "f10", Type: "STRING"},
                    {Name: "f11", Type: "STRING"},
                    {Name: "f12", Type: "STRING"},
                    {Name: "f13", Type: "STRING"},
                    {Name: "f14", Type: "STRING"},
                    {Name: "f15", Type: "STRING"},
                    {Name: "f16", Type: "STRING"},
                    {Name: "f17", Type: "STRING"},
                },
            },
        },
    },
}

FWIW,使用这个库的其他调用工作正常,所以我已经排除了 oauth 问题等。

编辑:我在请求发出之前捕获了它。请注意,这是在 http.Client 能够添加 oauth 标头之前。实际请求很大,所以我把它缩短了,去掉了标识符。

POST /upload/bigquery/v2/projects/.../jobs HTTP/1.1
Host: www.googleapis.com
User-Agent: google-api-go-client/0.5
Content-Length: 56369074
Content-Type: multipart/related; boundary=2220cacc03485c8143026fe3f0c40dcb1aaec8c8c2426e69adf620fc12cf

--2220cacc03485c8143026fe3f0c40dcb1aaec8c8c2426e69adf620fc12cf
Content-Type: application/json

{"configuration":{"load":{"destinationTable":{"projectId":"...","datasetId":"...","tableId":"..."},"skipLeadingRows":1,"fieldDelimiter":"|","maxBadRecords":3,"schema":{"fields":[{"name":"...","type":"STRING"},{"name":"...","type":"STRING"},{"name":"...","type":"STRING"},{"name":"...","type":"STRING"},{"name":"...","type":"STRING"},{"name":"...","type":"STRING"},{"name":"...","type":"STRING"},{"name":"...","type":"STRING"},{"name":"...","type":"STRING"},{"name":"...","type":"STRING"},{"name":"...","type":"STRING"},{"name":"...","type":"STRING"},{"name":"...","type":"STRING"},{"name":"...","type":"STRING"},{"name":"...","type":"STRING"},{"name":"...","type":"STRING"},{"name":"...","type":"STRING"}]}}}}

--2220cacc03485c8143026fe3f0c40dcb1aaec8c8c2426e69adf620fc12cf
Content-Type: text/plain; charset=utf-8

H0|H1|H2|H3|H4|H5|H6|H7|H8|H9|H10|H11|H12|H13|H14|H15|H16
f0_0|f0_1|f0_2|f0_3|f0_4|f0_5|f0_6|f0_7|f0_8|f0_9|f0_10|f0_11|f0_12|f0_13|f0_14|f0_15|f0_16
f1_0|f1_1|f1_2|f1_3|f1_4|f1_5|f1_6|f1_7|f1_8|f1_9|f1_10|f1_11|f1_12|f1_13|f1_14|f1_15|f1_16
# Three lines
# of comments
# in the trailer

--2220cacc03485c8143026fe3f0c40dcb1aaec8c8c2426e69adf620fc12cf--

【问题讨论】:

    标签: go google-bigquery google-api-go-client


    【解决方案1】:

    事实证明,这是由库中的错误导致的,该错误未发送所需的“uploadType”查询参数。请参阅these diffs 以获取修复该错误的补丁。

    然而,这暴露了我目前正在与作者合作修复的库中的另一个错误。修复后我会更新这个答案。

    编辑:截至this patch,上述错误已修复。

    【讨论】:

    • 链接似乎不再起作用了,请告诉我们哪个查询参数以及需要哪个值?如果您能给我们提供一个更新的链接,那就更好了。
    • 链接似乎对我有用。第一个指向一个补丁,它在大约 1490 行添加了“params.Set("uploadType", "multipart")" 行。第二个对 ConditionallyIncludeMedia 进行了一些更改(您需要单击“diff”链接到看到这些)
    【解决方案2】:

    让我先声明一下,我不是围棋专家。 也就是说,问题似乎出在您上传的数据上。看起来您正在执行媒体上传请求,因为您没有在作业配置中提供源 Google 存储路径,并且您发送的错误来自媒体上传器。

    但是,您没有显示对JobInsertCall.Media 的调用——您如何设置“媒体”字段?您能否验证它是有效数据,还是尝试使用虚拟数据?

    【讨论】:

    • 我确实在代码中调用了 JobInsertCall.Media。我什至在库发出调用之前就调用了 http.Request.Write(),并且可以看到 MIME 多部分有效负载至少看起来不错。
    • 您能否分享通过 http 请求发送的发布数据(授权标头已编辑)?
    • 请参阅上面的编辑以捕获请求。如果你能告诉我如何把它给你,我可以给你原来的要求。
    • 乔丹,感谢您的关注。最后,这是图书馆的一个错误。详情请看我的回答。
    猜你喜欢
    • 2012-07-03
    • 2011-05-25
    • 2014-04-11
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 2018-08-03
    相关资源
    最近更新 更多