RESTful веб-сервис не получает правильный запрос от C#

Я создал клиент aC# для использования моего веб-сервиса REST.

Я протестировал метод веб-сервиса с использованием SOAPUI, и он работает со следующим запросом

POST http://example.com/RestServiceImpl.svc/CallADSWebMethod HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 12
Host: localhost:35798
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)

{"test": "2"}

Однако я не могу создать тот же httppost из моего клиентского приложения.

ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>();       
postParameters.add(new BasicNameValuePair("test", "2"));

HttpClient client = GetHttpClient();
HttpPost request = new HttpPost("http://example.com/RestServiceImpl.svc/CallADSWebMethod");
request.SetHeader("content-type", "application/json");

UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters);
request.SetEntity(formEntity);

HttpResponse response = client.Execute(request);

Я использовал svctrace, чтобы проверить журналы сервисов и сообщение об ошибке, которое я вижу,

Средство форматирования выдало исключение при попытке десериализации сообщения: Ошибка в теле десериализации сообщения запроса для операции CallADSWebMethod. Обнаружен неожиданный персонаж 't'.

Кто-нибудь есть идеи, где я иду не так с этим запросом HttpPost?

1 ответ

Решение

UrlEncodedFormEntity не сериализует данные в формате JSON, что вам и нужно. У вас есть несколько вариантов:

  • Использовать JavaScriptSerializer как предложил @minhcat_vo, или любые другие сериализаторы JSON, включая DataContractJsonSerializer (который используется WCF), JSON.NET или любым другим. Затем используйте сериализованную строку и используйте StringEntity как ты делаешь. Однако вы, скорее всего, не получите объект JSON, если начнете с ArrayList<NameValuePair> учебный класс. Попробуйте вместо этого использовать словарь.
  • Вы также можете использовать System.Net.Http.HttpClient класс и использовать StringContent объект с тем же содержанием.
  • Если вы используете System.Net.Http.HttpClient Вы также можете использовать ObjectContent с JsonMediaTypeFormatter, который возьмет ваш объект и сериализует его с заданным форматером (в вашем случае, JSON).

Код ниже показывает один вариант:

var c = new HttpClient();
var req = new HttpRequestMessage(
    HttpMethod.Post,
    "http://example.com/RestServiceImpl.svc/CallADSWebMethod");
var body = new Newtonsoft.Json.Linq.JObject();
body.AddProperty("test", "2");
req.Content = new StringContent(body.ToString(), Encoding.UTF8, "application/json");
var resp = await c.SendAsync(req);
Другие вопросы по тегам