尝试使用HttpRequestMessage发送JSON正文时的错误响应

时间:2019-11-28 11:33:31

标签: c# json http

我需要使用JSON发送正文参数。我正在使用Printify API。 我不断从服务器收到错误响应,我的身体参数为空。

这是我要创建的命令:

POST https://api.printify.com/v1/uploads/images.json

它需要包含主体参数(这是API指南中的示例):

BODY PARAMETER (UPLOAD IMAGE BY BASE64-ENCODED CONTENTS)
{
    "file_name": "image.png",
    "contents": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
}

这是我的代码:

public class ImageContentsParams
{
    public string FileName { get; set; }
    public string Contents { get; set; }
}

ImageContentsParams imageContents = new ImageContentsParams();
imageContents.FileName = "example.png";
byte[] imageArray = System.IO.File.ReadAllBytes("D:\\example.png");
imageContents.Contents = Convert.ToBase64String(imageArray);
var json = JsonConvert.SerializeObject(imageContents);

using (HttpClient client = new HttpClient())
{
    var request = new HttpRequestMessage(new HttpMethod("POST"), "https://api.printify.com/v1/uploads/images.json");

    request.Content = jsonBody;

    using (HttpResponseMessage res = await client.SendAsync(request))
    {
        // here I'm checking the returned response
    }
}

我不断从Prinify服务器获得以下错误响应(这是在解析之后):

  

代码:10100   消息:验证失败。   原因:     file_name:必填文件名字段。     contents:不存在url时,内容字段是必填字段。     url:如果不存在内容,则必须输入url字段。

我在做什么错??

2 个答案:

答案 0 :(得分:1)

FileName属性将序列化为 fileName ,并且与 file_name 约定不匹配。更改属性以匹配或在序列化上指定映射架构,以将FileName转换为file_name。 您可以通过在FileName属性上指定[JsonProperty(“ file_name”)]属性来进行映射。像这样:

public class ImageContentsParams
{
    [JsonProperty("file_name")] 
    public string FileName { get; set; }
    public string Contents { get; set; }
}

答案 1 :(得分:0)

可能您的FileName中的JsonContentParams必须重命名为与该服务中期望的 JSON 相同。这是因为参数将被序列化,并且与服务的规范不匹配。

public class ImageContentsParams
{
    public string file_name { get; set; }
    public string contents { get; set; }
}

另一种解决方案是添加JsonProperty属性,以免重构所有代码。

public class ImageContentsParams
{
    [JsonProperty("file_name")] 
    public string FileName { get; set; }

    [JsonProperty("contents")] 
    public string Contents { get; set; }
}

尝试类似的方法,然后告诉我是否可行。