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