【问题标题】:C# eBay API Upload Return LabelC# eBay API 上传返回标签
【发布时间】:2018-01-12 07:04:29
【问题描述】:

我无法弄清楚如何使用 /post-order/v2/return/{returnId}/file/upload 调用将标签正确上传到 eBay。我不断收到“远程服务器返回错误:(400)错误请求。”。

我相信这可能与图像编码有关,但我并不完全确定。我已经能够通过 POST /return/{returnId}/decide 批准退货,但上传的下一步就是问题所在。我将图像数据保存为数据库中的 base 64 字符串。我知道数据很好,因为在其他调用中,我能够将该 base 64 字符串转换为应用程序中的图像。所以图像中的数据是没有问题的。事情在http://developer.ebay.com/Devzone/post-order/post-order_v2_return-returnId_file_upload__post.html#samplesellerlabel 上,它指出图像数据应该是“文件的base64 编码二进制表示”。

那么我在使用 Convert.ToBase64String(imageBytes) 抓取图像时收到的数据是否可能不是我真正需要的?关于如何在 C# 中执行此特定调用的示例很少甚至没有,我已经尝试了很多事情。我检查了 JSON 语法,它看起来是正确的。 (我已经删除了大部分字符串,因为它太大了。)

{"fileName":"5074119065_shippingLabel.jpeg","data":"R0lGODlhCAewBIEAAAAAAP///wAAAAAAACH/C05...zR2On54kkB4nfJYrLFRAAOw==","filePurpose":"LABEL_RELATED"}

我相当确信图像数据的格式不正确,但我不确定。如果有人对此电话有任何经验,我将不胜感激。下面是我的代码,错误出现在最后一行。标头和 JSON 代码在其他 eBay 调用中没有任何问题,这也是我怀疑我的问题可能与图像数据格式有关的原因。

string url = "https://api.ebay.com/post-order/v2/return/" + returnId + "/file/upload";

        var cancelOrderRequest = (HttpWebRequest)WebRequest.Create(url);

        cancelOrderRequest.Headers.Add("Authorization", "TOKEN " + authToken);
        cancelOrderRequest.ContentType = "application/json";
        cancelOrderRequest.Accept = "application/json";
        cancelOrderRequest.Headers.Add("X-EBAY-C-MARKETPLACE-ID", "EBAY_US");
        cancelOrderRequest.Method = "POST";

        string fileName = returnId + "_shippingLabel.jpeg";
        using (var streamWriter = new StreamWriter(cancelOrderRequest.GetRequestStream()))
        {
            string json = "{\"fileName\":\"" + fileName + "\",\"data\":\"" + labelData + "\",\"filePurpose\":\"LABEL_RELATED" + "\"}";

            streamWriter.Write(json);
            streamWriter.Flush();
            streamWriter.Close();
        }

        var response = (HttpWebResponse)cancelOrderRequest.GetResponse();

【问题讨论】:

    标签: c# json httpwebrequest httpwebresponse ebay-api


    【解决方案1】:

    嗯。 eBay 文档似乎不一致。在您为 Upload Return File 方法调用链接的文档页面的顶部,似乎表明 JSON 的 data 部分应该是字符串的 array,而不仅仅是单个字符串.

    有效载荷模型

    以下列出了请求中可能包含的所有字段

    { /* UploadFileRequest */
    "data": [
        string
        /* More string nodes here */
      ],
    "fileName": string,
    "filePurpose": token
    }
    

    但在它们显示在同一页面上的 JSON 示例中,data 显然是一个字符串,就像您在代码中使用的那样。 (请注意缺少方括号。)

    网址格式。另请参阅此 URL 的 non-wrapped 版本。

    POST https://api.ebay.com/post-order/v2/return/5000124931/file/upload
    {
      "fileName" : "jasmine.jpeg",
      "data" : "SGVyZSBpcyB5b3VyIHJld...YWNraW5nIG51bWJlciBpcyAxMjM0NTY3ODk4NzY1",
      "filePurpose" : "ITEM_RELATED"
    }
    

    我会尝试将其更改为数组以匹配记录的有效负载。我猜这里的示例可能是错误的。

    另外,我强烈建议使用像 Json.Net 这样的 JSON 序列化程序,而不是手动滚动您自己的 JSON,因为很容易弄错格式,这最终会导致你更“400 Bad Request”头痛。相反,尝试使用匿名对象生成 JSON,然后对其进行序列化,如下所示:

    var payload = new 
    {
        fileName = returnId + "_shippingLabel.jpeg",
        data = new List<string> { labelData },
        filePurpose = "LABEL_RELATED"
    };
    
    string json = JsonConvert.SerializeObject(payload);
    

    【讨论】:

    • 感谢您的反馈,但遗憾的是,将其更改为字符串数组不起作用。我确实将其更改为使用 Json 序列化,这是我将在未来使用的东西。但是在使用您的示例时仍然无法正常工作。
    • 好的,感谢您的尝试。很遗憾听到它没有成功。
    • @NikolayKuznetsov 我从来没有找到解决这个问题的方法,在多次尝试后我放弃了寻找解决方案。
    • @Roro 如果我使用 base64 对 PDF 文件进行两次编码,它似乎对我有用,将其作为字符串而不是数组提供,并提供文件名。
    • @NikolayKuznetsov 你能提供你的代码示例吗?
    猜你喜欢
    • 2011-10-11
    • 2014-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    相关资源
    最近更新 更多