我有一个RESTful WCF服务,其中一个方法使用Object作为参数
[WebInvoke(UriTemplate = "save", Method = "POST", RequestFormat = WebMessageFormat.Xml, ResponseFormat= WebMessageFormat.Xml), OperationContract]
public SampleItem Create(SampleItem instance)
{
return new SampleItem() { Id = 1, StringValue = "saved" };
// TODO: Add the new instance of SampleItem to the collection
//throw new NotImplementedException();
}
我试图从我的eclipse android项目中调用这个方法。我正在使用这些代码行
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost post=new HttpPost("http://10.0.2.2:2768/Service1.svc/save");
ArrayList<NameValuePair> nvp= new ArrayList<NameValuePair>();
nvp.add(new BasicNameValuePair("Id", "1"));
nvp.add(new BasicNameValuePair("StringValue", "yolo"));
post.setEntity(new UrlEncodedFormEntity(nvp));
HttpResponse httpResponse = httpClient.execute(post);
HttpEntity httpEntity = httpResponse.getEntity();
String xml = EntityUtils.toString(httpEntity);
每次我在服务方法返回的XML中收到此错误Method not allowed.
。
我试过从浏览器调用它,但在那里遇到了同样的错误。
请告诉我我做错了什么以及我能做些什么。
提前感谢任何可以提供帮助的人。
注意:其他不使用object作为参数的方法工作正常。
编辑:尝试Fiddler2成功。但又停了下来。我尝试使用网址SampleItem Create(SampleItem instance)
调用方法http://localhost:2768/Service1.svc/save
并且它有效。该方法以XML格式返回对象。
在fiddler我添加了请求正文
<SampleItem xmlns="http://schemas.datacontract.org/2004/07/WcfRestService1" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><Id>1</Id><StringValue>saved</StringValue></SampleItem>
但问题是我找不到任何方法将此xml字符串添加到 HttpPost 或 HttpRequest 作为 requestbody eclipse android项目
注意:将xml字符串作为标题或 UrlEncodedFormEntity 传递不起作用。
答案 0 :(得分:2)
最后我成功将 json 对象发送到我的 WCF服务这里是我的代码
URI uri = new URI("http://esimsol.com/droidservice/pigeonlibrary.service1.svc/save");
JSONObject jo1 = new JSONObject();
jo1.put("Id", "4");
jo1.put("StringValue", "yollo");
HttpURLConnection conn = (HttpURLConnection) uri.toURL().openConnection();
conn.setRequestProperty("Content-Type","application/json; charset=utf-8");
conn.setRequestProperty("Accept", "application/json");
conn.setRequestProperty("User-Agent", "Pigeon");
conn.setChunkedStreamingMode(0);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.connect();
DataOutputStream out = new DataOutputStream(conn.getOutputStream());
out.write(jo1.toString().getBytes());
out.flush();
int code = conn.getResponseCode();
String message = conn.getResponseMessage();
InputStream in = conn.getInputStream();
StringBuffer sb = new StringBuffer();
String reply;
try {
int chr;
while ((chr = in.read()) != -1) {
sb.append((char) chr);
}
reply = sb.toString();
} finally {
in.close();
}
SampleItem SI = new SampleItem();
SI=new Gson().fromJson(reply, SampleItem.class);
Toast.makeText(getApplicationContext(), SI.getStringValue(),Toast.LENGTH_LONG).show();
conn.disconnect();
感谢 StackOverFlow 。 我必须结合许多代码片段才能实现这一目标。
答案 1 :(得分:0)
首先,您应该从浏览器中获取Web服务方法 - 我建议使用Fiddler2 - 使用您的对象更容易构造请求主体,并在发布帖子时设置请求标头。它会显示响应,因此应该有助于调试。 至于你的代码,我正在对WCF服务进行POST,而不是做
post.setEntity(new UrlEncodedFormEntity(nvp));
我只是在做:
HttpPost request = new HttpPost(url);
// Add headers.
for(NameValuePair h : headers)
{
request.addHeader(h.getName(), h.getValue());
}
(我使用的是JSONObjects,我的WebInvoke参数中有RequestFormat = WebMessageFormat.Json。
另外,请检查您在网址中使用正确的UriTemplate名称,因为它们区分大小写。
答案 2 :(得分:0)