2016-08-30 6 views
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#コードで何を変更する必要がありますか?

+0

Fiddlerを実行している間に両方を試してみると、フォーマットの違いを見ることができます。それから、あなたは何を変えなければならないのか分かります。 – SledgeHammer

+2

'Customer'をシリアル化しないでください。' PostAsJsonAsync'で自動的に行われます。 – Crowcoder

+1

右、 'Customer'を2回シリアル化しています。これはエスケープされたJSONで終わります。 –

答えて

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"); 
関連する問題