我一直无法弄清楚如何使用/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 语法,它看起来是正确的。 (我已经删除了字符串的很大一部分,因为它太大了。
{"文件名":"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();
嗯。eBay的文档似乎不一致。 在为上传返回文件方法调用链接的文档页面的顶部,似乎表明 JSON 的data
部分应该是字符串数组,而不仅仅是单个字符串。
有效负载模型
下面列出了请求中可能包含的所有字段。
{ /* UploadFileRequest */ "data": [ string /* More string nodes here */ ], "fileName": string, "filePurpose": token }
但是在它们在同一页面上显示的 JSON 示例中,data
显然是一个字符串,就像您在代码中一样。 (请注意,方括号丢失了。
网址格式。另请参阅此 URL 的非包装版本。
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 错误请求"的麻烦。相反,请尝试使用匿名对象创建 JSON,然后对其进行序列化,如下所示:
var payload = new
{
fileName = returnId + "_shippingLabel.jpeg",
data = new List<string> { labelData },
filePurpose = "LABEL_RELATED"
};
string json = JsonConvert.SerializeObject(payload);