我创建了一个c#客户端来使用我的REST Web服务。
我已使用SOAPUI测试了Web服务方法,它可以使用以下请求
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请求我哪里出错?
答案 0 :(得分:1)
UrlEncodedFormEntity
没有以JSON格式序列化数据,这正是您想要的。您有几个选择:
JavaScriptSerializer
作为建议的@minhcat_vo,或任何其他JSON序列化程序,包括DataContractJsonSerializer
(恰好是WCF使用的),JSON.NET或任何其他。然后使用序列化字符串tand使用StringEntity
。但是,如果以ArrayList<NameValuePair>
类开头,则可能无法获得JSON对象。请尝试使用字典。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);