2016-08-30 2 views
0

У меня есть небольшое приложение C#, которое использует HttpClient для POST массива JSON для API REST, реализованного в Java Jersey 2.0.Как правильно настроить POST JSON, чтобы избежать ошибочного запроса HTTP 400?

Мой клиент код выглядит следующим образом:

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.

Когда я использую небольшой Python HttpClient кода против того же API, он прекрасно работает:

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?

+0

Попробуйте запустить оба режима, пока вы используете Fiddler, и вы сможете увидеть различия в формате. Затем вы узнаете, какие изменения нужно внести. – SledgeHammer

+2

Не сериализуйте 'Customer', это произойдет автоматически с' PostAsJsonAsync'. – Crowcoder

+1

Правильно, вы дважды сериализуете «Клиент», и в итоге получается сбежавший JSON. –

ответ

1

Я рекомендую вам использовать Inspect Element в FireFox, чтобы увидеть заголовок запроса в разделе «Сеть». Вы должны добавить некоторые другие заголовки. Я думаю, что нижеперечисленные будут делать эту работу:

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");