从java调用带有对象作为参数的RESTful WCFservice方法

Posted

技术标签:

【中文标题】从java调用带有对象作为参数的RESTful WCFservice方法【英文标题】:calling RESTful WCFservice method with object as parameter from java 【发布时间】:2012-06-07 09:20:02 【问题描述】:

我有一个 RESTful WCF 服务,其方法之一使用对象作为参数

[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.

我尝试从浏览器调用它,但在那里遇到了同样的错误。

请告诉我我做错了什么以及我能做些什么。

提前感谢任何可以提供帮助的人。

注意:其他不使用对象作为参数的方法工作正常。

编辑:成功尝试了 Fiddler2。但又停了下来。

我尝试使用 URL http://localhost:2768/Service1.svc/save 调用方法 SampleItem Create(SampleItem instance) 并且它有效。该方法以 XML 格式返回对象。

在提琴手中,我将请求正文添加为 &lt;SampleItem xmlns="http://schemas.datacontract.org/2004/07/WcfRestService1" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"&gt;&lt;Id&gt;1&lt;/Id&gt;&lt;StringValue&gt;saved&lt;/StringValue&gt;&lt;/SampleItem&gt;

但问题是我找不到任何方法将此 xml 字符串添加到 HttpPostHttpRequest 作为 requestbody eclipse android项目。

注意:将 xml 字符串作为 HeaderUrlEncodedFormEntity 传递不起作用。

【问题讨论】:

【参考方案1】:

我终于成功地将 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();

感谢 ***。 我不得不结合一些代码 sn-ps 来实现这一点。

【讨论】:

【参考方案2】:

首先,您应该让 Web Service 方法在浏览器中工作 - 我建议使用 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。

此外,请检查您在 url 中使用了正确的 UriTemplate 名称,因为它们区分大小写。

【讨论】:

这真的很有帮助,谢谢,但我想使用 XML 在 WCF 服务之间传递对象。你能帮忙解决这个问题吗?或者有什么建议可以使用,JSON 还是 XML。 我试过 fiddler,但还是卡住了。如果你想看到我的编辑和分享,请。【参考方案3】:

要调用该 WCF 服务,您必须构建有效的 SOAP 请求并发布它。最好在 Android 上使用一些 SOAP 协议栈 - 例如kSoap2。

这里是example 使用 kSoap2 调用 WCF 服务。 只需在您的项目中添加 KSOAP2 库。关于我们如何在 Android 项目中添加 KSOAP2,请参阅this post

【讨论】:

嗨,我实际上尝试过 ksoap2。但这对我没有任何好处。所以我切换到 REST。请如果你能看到我的编辑和分享。

以上是关于从java调用带有对象作为参数的RESTful WCFservice方法的主要内容,如果未能解决你的问题,请参考以下文章

设计带有一长串查询参数的 RESTful 查询 API [关闭]

从 Android 向 .net Restful WebService 发送参数

如何使用 JNI 从 JAVA 调用带有 C++ 参数的函数?

如何使用 GraalVM 从 C++ 调用具有非原始类型作为参数的 Java 入口点方法

从 PostgreSQL 过程/函数调用 RESTful Web 服务

这种接口怎么调用?怎么传递参数?