Android 向 WCF RESTful WS 发布请求(JSON 参数)
Posted
技术标签:
【中文标题】Android 向 WCF RESTful WS 发布请求(JSON 参数)【英文标题】:Android post request (JSON parameter) to the WCF restful WS 【发布时间】:2013-03-27 20:06:44 【问题描述】:我正在开发 android 应用程序,但对我的 WCF Restful WS 的“POST”请求(像往常一样)有问题。
宁静法:
[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, UriTemplate = "createUser")]
string createUser(string user);
我为了找到一个错误,我放在方法实现的注释体下,现在看起来像:
public string createUser(string user)
return user;
我已经从 JS(jQuery, Ajax) 使用 JSON.stringify(datos) 调用此方法数百次,没有任何问题。 现在我需要从 android 应用程序做同样的事情。 这可能是我的代码的 sn-p 导致问题:
JSONObject user = new JSONObject();
user.put("id", "15");
user.put("name", "John");
user.put("city", "France");
user.put("email", "myemail");
user.put("password", "mypass");
HttpClient client = new DefaultHttpClient();
URI website = new URI("http://10.0.2.2/AutoOglasi/Service1.svc/createUser");
HttpPost request = new HttpPost();
request.setEntity(new StringEntity(user.toString()));
request.addHeader("content-type", "application/json");
request.setURI(website);
HttpResponse response = client.execute(request);
我正在收到来自服务器的响应(我的客户端没有错误):
The exception message is 'There was an error deserializing the object of type
System.String. End element 'root' from namespace '' expected. Found element 'id' from
namespace ''.'.See server logs for more details. The exception stack trace is: </p> <p>at
System.ServiceModel.Dispatcher.OperationFormatter.DeserializeRequest(Message message,
Object[] parameters) at
System.ServiceModel.Dispatcher.DemultiplexingDispatchMessageFormatter.DeserializeRequest(Me ssage message, Object[] parameters) at
System.ServiceModel.Dispatcher.UriTemplateDispatchFormatter.DeserializeRequest(Message message, Object[] parameters) at
System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc& rpc) at
System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) at
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) at
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)</p> </div> </body></html>
有什么建议或帮助吗?
【问题讨论】:
【参考方案1】:我已经很有趣地解决了这个问题:
1) 我必须在我的服务方法中添加 BodyStyle = WebMessageBodyStyle.WrappedRequest 以避免出现上述错误。我真的不明白为什么,因为它与没有 BodyStyle 参数的 jQuery Ajax 调用完美配合。如果有人能解释一下,我将不胜感激?
2)我用过:String s = "\"id\":\"1\", \"name\":\"John\", \"user\":\"New Yourk\", \"email\":\"mypass\", \"密码\":\"myemail\"";作为测试字符串。我将参数“城市”的名称更改为用户。我将它发送到我的服务,作为响应,我得到了“New Yourk”,只有一个参数名称为我的 WS 方法参数。
这意味着我需要发送一个名为“用户”和值的参数。比如:
JSONObject userValue = new JSONObject();
JSONObject user = new JSONObject();
userValue .put("id", "15");
userValue .put("name", "John");
userValue .put("city", "France");
userValue .put("email", "myemail");
userValue .put("password", "mypass");
user.put("user", userValue.toString());
现在我的请求已经完成,我的服务器端可以处理我的用户参数了。
注意:将“userValue”添加为字符串(user.put("user", userValue.toString()))非常重要。如果我们将其添加为 Json (user.put("user", userValue)) 它将不起作用。
【讨论】:
【参考方案2】:不知道和这个问题有没有关系,但是id应该是字符串吗?
我猜应该是这个:
user.put("id", 15);
【讨论】:
对不起,我刚刚编辑了我的最后一句话,我没有收到错误,这是我从服务器响应的。我试过你的建议,没有任何改变。 我在服务器端的参数是一个字符串(JSON),我应该解析它,除了字符串没有任何其他类型。以上是关于Android 向 WCF RESTful WS 发布请求(JSON 参数)的主要内容,如果未能解决你的问题,请参考以下文章
使用 WCF/RESTful 服务的 Android 应用程序
将字符串从 android 传递到 wcf restful 服务变得空