我使用的是使用WCF网络服务的Android设备。
我设法从WCF获取JSON消息,发送文件但我没有设法将POST参数发送到WCF服务。我的目标是有这样的想法(或获取一个对象,然后反序列化JSON)。 (用户是一个复杂的对象,基本上由String和Integer组成)
[OperationContract]
[WebInvoke(
Method = "POST",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "interventions")]
public void SendInterventions(List<User> user)
{
}
正如http://debugmode.net/2011/05/15/wcf-rest-service-with-josn-data/
所述我使用了HTTP Post代码,例如:http://www.softwarepassion.com/android-series-get-post-and-multipart-post-requests/
我的第一次尝试非常简单,我想发送一个简单的字符串post param,但它不起作用。
HttpClient client = new DefaultHttpClient();
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("user", "kris"));
UrlEncodedFormEntity ent = new UrlEncodedFormEntity(params, HTTP.UTF_8);
HttpPost post = new HttpPost(url);
post.setEntity(ent);
HttpResponse response = client.execute(post);
HttpEntity resEntity = response.getEntity();
和.Net代码
[OperationContract]
[WebInvoke(
Method = "POST",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "interventions")]
public void SendInterventions(String user)
{
}
有人有一个很好的例子或一些提示吗?
问候并感谢
修改
好吧,我打开了asp .net wcf中的错误报告。
01-22 11:49:46.800: D/SendInterventions(2049):
<Fault xmlns="http://schemas.microsoft.com/ws/2005/05/envelope/none">
<Code><Value>Receiver</Value>
<Subcode><Value xmlns:a="http://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/dispatcher">a:InternalServiceFault</Value></Subcode>
</Code><Reason>
<Text xml:lang="fr-FR">Le message entrant a un format inattendu 'Raw'. Les formats de message attendus pour l'opération sont 'Xml'; 'Json'. Un WebContentTypeMapper n'a peut-être pas été configuré sur la liaison. Pour plus d'informations, consultez la documentation relative à WebContentTypeMapper.</Text>
</Reason><Detail><ExceptionDetail xmlns="http://schemas.datacontract.org/2004/07/System.ServiceModel" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><HelpLink i:nil="true"/><InnerException i:nil="true"/>
<Message>Le message entrant a un format inattendu 'Raw'. Les formats de message attendus pour l'opération sont 'Xml'; 'Json'. Un WebContentTypeMapper n'a peut-être pas été configuré sur la liaison. Pour plus d'informations, consultez la documentation relative à WebContentTypeMapper.</Message>
<StackTrace> à System.ServiceModel.Dispatcher.DemultiplexingDispatchMessageFormatter.DeserializeRequest(Message message, Object[] parameters)
修改2
我有这个错误
01-22 12:28:06.830: W/System.err(2496): java.lang.IllegalStateException: Content has been consumed
我用Google搜索了,我看到了那个页面:Using HttpClient and HttpPost in Android with post parameters
我修改了代码并添加了httpPost.setHeader(“Accept”,“application / json”);
然后魔术它在asp .net方法中输入但是有一个缺点(虽然IllegalStateException停留但不太重要)
只有在方法为:
时输入方法public void SendInterventions(object user)
而不是:
public void SendInterventions(String user)
我无法对该对象执行任何操作(例如,无法将其转换为String),如果我重命名用户参数,它也将无法正常工作。 (所以我们可以承认解析了json查询,因为他可以检测用户参数)
我尝试了另一个代码:
JSONObject jsonObj = new JSONObject();
jsonObj.put("user", "test");
StringEntity entity = new StringEntity(jsonObj.toString(), HTTP.UTF_8);
entity.setContentType("application/json");
post.setEntity(entity);
同样的效果.. :(任何想法?
编辑3
我在WCF REST POST of JSON: Parameter is empty
上找到了另一个非常有趣的页面如果我修改WebInvoke,如:
[WebInvoke(
RequestFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.WrappedRequest,
UriTemplate = "interventions")]
(缺少BodyStyle参数,我希望我能用该方法发送复杂的json数据)
答案 0 :(得分:1)
我的法语不太好,但我猜你必须明确设置你的请求的Content-type
。 Web服务接受json
但传入的请求为raw
。
尝试在请求中添加application/json
作为内容类型。像这样:
post.setHeader("Content-Type", "application/json");