【问题标题】:POSTing from Android to WCF REST web service: how to retrieve passed json data从 Android 发布到 WCF REST Web 服务:如何检索传递的 json 数据
【发布时间】:2011-06-17 10:25:37
【问题描述】:

我正在尝试从应以 json 格式传递一些数据的 android 客户端联系 RESTful WCF POST Web 服务。我已经成功联系了一个 RESTful WCF GET 网络服务,但我无法弄清楚 POST 版本是如何工作的。

这是进行调用的android客户端代码:

HttpPost request = new HttpPost(uri);
request.setHeader("Accept", "application/json");
request.setHeader("Content-type", "application/json");
/*... Building the NameValuePairs object ... */
request.setEntity(new UrlEncodedFormEntity(nameValuePairs));
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpResponse response = httpClient.execute(request);
/* ... handling the response ...*/

这是 WCF Web 服务代码:

[WebInvoke(Method = "POST",
        UriTemplate = "ServiceActivation",
        BodyStyle = WebMessageBodyStyle.WrappedRequest,
        RequestFormat = WebMessageFormat.Json,
        ResponseFormat = WebMessageFormat.Json)]
    string MyPostMethod();

public string MyPostMethod()
    {
        try
        {
            /*...*/
        }
        catch (Exception e)
        {
            /*...*/
        }
    }

这样android客户端就成功联系到web服务了;但我不知道如何在 MyPostMethod 中检索从 android 客户端传递的数据。像这样:MyPostMethod(string data) 以来自 android 客户端的错误请求结束。

那么,在 Web 服务中检索传递的数据的方法是什么?

提前致谢!

【问题讨论】:

    标签: android wcf json post


    【解决方案1】:

    您必须为您发布的数据定义data contract - 通常是类或一组相关类,它们将用于反序列化 JSON 消息并将该类用作输入参数。 Here is example 如何在没有 WCF 服务的情况下使用数据协定 - 它可以帮助您为消息定义正确的协定。

    编辑:

    我刚刚注意到您发布的是 url 编码值 - 这不是 JSON 请求,它具有不同的内容类型:application/x-www-form-urlencoded。 WCF 的 JSON 请求是在请求内容中传递的 JSON。在 WCF 中处理 URL 编码的请求是 hard。这将在 has support for these requests 的 Web API 中发生变化。

    【讨论】:

    • 发布 url 编码值是一个错误,谢谢。我将更改它以实际发送 json 数据,这正是我所需要的。好的数据合约;但是如何声明 MyPostMethod 可以在哪里检索这些数据?
    • 您只需创建SomeData 合约类并将您的方法定义为public string MyPostMethod(SomeData data)。 WCF 将为您反序列化对合约的请求。顺便提一句。如果你想返回 JSON,你也应该有响应的数据契约。
    • 好的,谢谢,我试试。不管返回值,因为它必须只是一个字符串。
    • 好吧,如果你知道怎么做,最后它会变得很容易:) 解决了你说的定义一个数据合同类(MyPostMethod(SomeData data))和神奇的数据方法体包含反序列化的值。非常感谢!
    【解决方案2】:

    Gson 使得在 Android 中构建 json 消息变得相当容易。

    LoginToWebSiteRequest loginToWebSiteRequest = new LoginToWebSiteRequest();// a pojo based on some json message
    loginToWebSiteRequest.setEmail(email);
    loginToWebSiteRequest.setPassword(password);
    Gson gson = new Gson();
    String json = gson.toJson(loginToWebSiteRequest,LoginToWebSiteRequest.class);
    HttpPost httpPost = new HttpPost(loginUrl);
    httpPost.setHeader("Accept", "application/json");
    httpPost.setHeader("Content-type", "application/json; charset=UTF-8");
    

    【讨论】:

      【解决方案3】:

      对不起。我没有回答这个问题:

      1. j0nSn0w 做了哪些更改 request.setEntity(new UrlEncodedFormEntity(nameValuePairs));
      2. 如果 j0nSn0w 认为“好吧,如果你知道怎么做,最终结果会很容易 :)”;请发布您的解决方案。

      我与 j0nSn0w 在 6 月 17 日的情况类似,只能将此线程视为建设性指针。

      将实际解决方案排除在票之外似乎是不正当的。

      【讨论】:

      • 我没有代码了,所以我不记得在 A 点所做的确切更改(但感觉是,在这里您必须指定要用于传输数据的数据格式); B 点的解决方案只是用 [DataContract] 属性标记 WCF Post 方法中使用的类(示例中为 SomeData 类)(您必须在类定义中将其写在类名之前)。跨度>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多