【问题标题】:How to properly POST JSON array to avoid HTTP 400 Bad Request?如何正确发布 JSON 数组以避免 HTTP 400 错误请求?
【发布时间】:2016-08-30 20:50:24
【问题描述】:

我有一个小型 C# 应用程序,它使用 HttpClient 将 JSON 数组发布到 Java Jersey 2.0 中实现的 REST API。

我的客户端代码如下所示:

public class Customer {
  public string Name { get; set; }
  public string Address { get; set; }
}

Client.Customer customer1 = new Client.Customer {
  Name = "name 1", Address = "address 1"
};
Client.Customer customer2 = new Client.Customer {
  Name = "name 2", Address = "address 2"
};

List < Client.Customer > customerList = new List < Client.Customer > ();
customerList.Add(customer1);
customerList.Add(customer2);

string json = JsonConvert.SerializeObject(customerList);

EnvokeCreateCustomer("http://10.3.3.5:8080/", "jersey_test/webapi/customer", json).Wait();

static async Task EnvokeReadCustomer(string baseUrl, string apiUrl) {
  RestClient.Client restClient = new RestClient.Client();
  await restClient.ReadCustomer(baseUrl, apiUrl);
}

public async Task CreateCustomer(string baseUrl, string apiUrl, string customer) {
  using(var client = new HttpClient()) {
    client.BaseAddress = new Uri(baseUrl);
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    client.DefaultRequestHeaders.Add("Accept", "application/json");

    var response = await client.PostAsJsonAsync(apiUrl, customer);
    var p = response;
  }
}

当我运行它时,我收到 HTTP 400 Bad Request。

当我针对同一个 API 使用一个小的 Python HttpClient 代码时,它运行良好:

import json
import urllib2

data = [{"name":"Customer 1", "address":"customer address 1"},
        {"name":"Customer 2", "address":"customer address 2"}]
payload = json.dumps(data)

req = urllib2.Request('http://10.3.3.5:8080/jersey_test/webapi/customer')
req.add_header('Content-Type', 'application/json')

response = urllib2.urlopen(req, json.dumps(data))

我应该在我的 C# 代码中进行哪些更改才能使这个 POST 工作?

【问题讨论】:

  • 尝试在运行 Fiddler 的同时运行两者,您将能够看到格式差异。然后您就会知道需要进行哪些更改。
  • 不要序列化CustomerPostAsJsonAsync 会自动发生。
  • 对,你将Customer 序列化了两次,最终得到一个转义的 JSON。
  • SledgeHammer 和 Yuval 都是正确的:使用 fiddler 显示 API 不喜欢大小写的名称(不知道为什么),这是 Yuval 认为的实际问题。

标签: c# json dotnet-httpclient


【解决方案1】:

我建议您使用 FireFox 中的 Inspect Element 来查看网络部分中的请求标头。您应该添加一些其他标题。我认为下面的人会完成这项工作:

httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate");
httpClient.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0");
httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Charset", "ISO-8859-1");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多