如何为发布请求格式化json

时间:2018-12-20 16:13:02

标签: c# json rest json.net

我不确定如何在C#中执行我的帖子请求。我曾尝试在Postman中进行操作,并且在这里工作没有问题。我认为我的问题是json格式。我在Newtonsoft库中使用JObjects构造了json。运行下面的代码时,这是输出; {"accountreference":"XX","messages":"[{\r\n \"to\": \"+XXXXX\",\r\n \"body\": \"XXXXXXXX\"\r\n}]"}是有效的,但是如您所见,它包含换行符和转义符。将其发布到我正在使用的api上后,我总是会收到一个400错误的请求。

我尝试了各种序列化器和技术,但无法使其正常工作。我还确保Authroization标头正确,如果不正确,API应该在其返回消息中这样说。根据API的开发人员,此消息仅应在正文不正确的情况下发生。我曾尝试在Postman中用换行符发布字符串,但也能产生400。有没有简便的方法可以摆脱它们?

var tmpObj = new JObject {{"to", to}, {"body", message}};

var jsonObj = new JObject
{
    {"accountreference", MessageConfiguration.Ref}, {"messages", "[" + tmpObj + "]"}
};

var json = jsonObj.ToString(Formatting.None);

var httpContent = new StringContent(json, Encoding.UTF8, "application/json");

var url = new Uri("www.xxxxxxxx/hjdhsf");
return await PostAsync(url, httpContent);


protected async Task<HttpResponseMessage> PostAsync(Uri endpoint, HttpContent content)
{
    using (var httpClient = NewHttpClient())
    {
        var result = await httpClient.PostAsync(endpoint, content);
        return result; //Statuscode is 400 here. 
    }
}

此有效json在邮递员中有效:

{
    "accountreference":"XXXXX",
    "messages":[{
        "to":"XXXXX",
        "body":"XXX!"
    }]
}

更新:

根据回答,我尝试了这个:

var body = new
{
    accountreference = MessageConfiguration.Ref,
    messages = new[]
    {
        new
        {
            to = to,
            body = message
        }
    }
};

var json = new JavaScriptSerializer().Serialize(body);

现在json看起来正确了,我什至可以将其从VS复制到邮递员中,并且可以正常工作。 但是我在VS中的要求仍然返回400。

3 个答案:

答案 0 :(得分:2)

您不需要使用JObject构建JSON。您可以使用匿名类,也可以使用Paste JSON as Classes粘贴JSON示例。根据您的JSON样本,一个匿名对象看起来像这样。

var body = new
{
    accountrefrence = "XXXXX",
    messages = new[]
    {
        new
        {
            to = "XXXX",
            body = "XXX!"
        }
    }
}

实际的类可能看起来像这样:

public class Rootobject
{
    public string accountreference { get; set; }
    public Message[] messages { get; set; }
}

public class Message
{
    public string to { get; set; }
    public string body { get; set; }
}

答案 1 :(得分:0)

管理JSON序列化的最简单方法是使用对象而不是原始字符串,或者尝试手动组合输出(就像您在此处所做的那样)。

由于您已经在使用Newtonsoft库,因此它非常容易实现。

第一件事就是创建一个对象,该对象代表您想要发送到api的数据。如此处另一个答案所述,您可以简单地通过复制示例JSON来完成此操作,然后在VS中执行“将JSON作为类粘贴”。

最有可能的结果类是:

public class Rootobject
{
    public string accountreference { get; set; }
    public Message[] messages { get; set; }
}

public class Message
{
    public string to { get; set; }
    public string body { get; set; }
}

您现在可以做的是获取数据并填充此对象的属性的方法。由于您没有提供有关正在执行的操作的详细信息,因此我仅假设您可以使用某种方法以某种方式接收字符串值。

    public void ComposeAndSendJson(string accountReference, string toAddress, string messageBody)
    {
        RootObject whatIwanttoSend = new RootObject();
        Message messageComposed = new Message();

        messageComposed.to = toAddress;
        messageComposed.body = messageBody;

        whatIwanttoSend.accountReference = accountReference;

        //I'm doing a pretty bad aproach but it's just to ilustrate the concept
        whatIwanttoSend.messages.toList().Add(messageComposed);

        var jsonData = JsonConvert.SerializeObject(whatIwanttoSend);

        //As you're working on async, you may need to do some working on here. In this sample i'm just calling it in Sync. 
        var ApiResponse = PostAsync("YOURENDPOINT",jsonData).Result();

        //Do something else with the response ... 

    }


    protected async Task<Task<HttpResponseMessage> PostAsync(Uri endpoint, object payload)
    {
        using (var httpClient = NewHttpClient())
        {
            //You have to tell the API you're sending JSON data
            httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            //Execute your call
            var result = await httpClient.PostAsJsonAsync(endpoint, payload);

            //Basic control to check all went good.
            if (result.IsSuccessStatusCode)
            {
                return result;
            }

            //Do some management in case of unexpected response status here... 
            return result; //Statuscode is 400 here. 
        }
    }

我希望这会让您走上正确的道路。

答案 2 :(得分:0)

在这里找到我的答案

POSTing JsonObject With HttpClient From Web API

我必须在内容中添加一个附加标头,如下所示:

var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json");
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
var result = client.PostAsync(url, content).Result;

我真的很想知道在StringContent构造函数中指定它的目的是什么,