0
私はHttpClientを使用してJSON配列をJava Jersey 2.0に実装されたREST APIにPOSTする小さなC#アプリケーションを用意しています。HTTP 400の不正リクエストを避けるためにJSON配列を正しくPOSTする方法は?
私のクライアントコードは次のようになります。
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不正な要求を取得します。
私は同じ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))
私はこのPOSTを動作させるために、私のC#コードで何を変更する必要がありますか?
Fiddlerを実行している間に両方を試してみると、フォーマットの違いを見ることができます。それから、あなたは何を変えなければならないのか分かります。 – SledgeHammer
'Customer'をシリアル化しないでください。' PostAsJsonAsync'で自動的に行われます。 – Crowcoder
右、 'Customer'を2回シリアル化しています。これはエスケープされたJSONで終わります。 –