【问题标题】:REST post formatREST 帖子格式
【发布时间】:2009-10-02 01:53:37
【问题描述】:

当您使用 REST 通过 POST 创建新条目时,我看到一些 API(例如 Google's)指定您将 XML 作为请求的一部分发送,而其他 API 则指定您发送键/值对。 REST POST-s 是否有标准或最佳实践?

【问题讨论】:

    标签: rest http-post


    【解决方案1】:

    任何可行的表示格式都可以,但规定您应该非常努力地使用标准格式,例如存在的 Atom。

    更新这是来自 Roy Fielding(HTTP 标准的合著者,在他的博士论文中阐述 REST 的人)的relevant quote。如何设计 Web 服务中使用的表示非常重要:

    一个 REST API 应该花费几乎所有 其在定义方面的描述性努力 用于的媒体类型 代表资源 [...]

    请务必阅读后续问答。

    【讨论】:

      【解决方案2】:

      这取决于 REST 服务实现者。

      如果 REST 服务是对现有 html HTML 表单的改编,则发布键值对通常更容易开始。

      从 JavaScript 发布信息时,使用 JSON 通常更容易。

      之所以经常使用 XML,是因为它易于人类理解,而且每种语言/平台都有大量工具可以处理它。

      【讨论】:

      • XML 比 JSON 更容易理解?
      【解决方案3】:

      我建议使用最简单的,因为这就是 REST 的全部意义所在。下面的代码 sn-p 是我发帖的方式。我知道您不是专门寻找代码,但下面的 API (httpClient) 效果很好。然后,您可以使用我们编码人员一直使用的工具 (request.getParameter()) 对其进行解码。我相信这就是 REST 与 SOAP 的不同之处。不要让它变得困难!使用 HTTP!

          public void testHttpClient() {
          PostMethod pMethod = null;
          pMethod = new PostMethod("...url...");
          NameValuePair[] data = {new NameValuePair("activeFlag", "yes"), new NameValuePair("custCode", "B010"), new NameValuePair("comments", "mark is cool")};
          pMethod.setRequestBody(data);
          this.makeCall(pMethod);
      }
      private String makeCall(HttpMethod method) {
          String response = null;
          HttpClient client = new HttpClient();
          client.getParams().setAuthenticationPreemptive(true);
          client.getState().setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(this.logon, this.pass));
          method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(3, false));
          method.getParams().setIntParameter(HttpMethodParams.SO_TIMEOUT, 5000);
          try {
              int statusCode = client.executeMethod(method);
              if (statusCode != HttpStatus.SC_OK) {
                  System.err.println("Method failed: " + method.getStatusLine());
              }
              String aLine = null;
              StringBuffer sb = new StringBuffer();
              BufferedReader in = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream()));
              while ((aLine = in.readLine()) != null) {
                  sb.append(aLine.trim());
                  System.out.println(aLine);
              }
              in.close();
              response = sb.toString();
          } catch (HttpException e) {
              System.err.println("Fatal protocol violation: " + e.getMessage());
              e.printStackTrace();
          } catch (IOException e) {
              System.err.println("Fatal transport error: " + e.getMessage());
              e.printStackTrace();
          } finally {
              method.releaseConnection();
          }
          return response;
      }
      

      【讨论】:

        【解决方案4】:

        SOAP 是 WebServices 的标准(我认为您对 WebServices 和 REST 有点困惑)。

        但这真的取决于实施者。

        【讨论】:

        • “Web 服务”现在是一个更通用的术语,描述了构建 Web 的方法,以便程序浏览和操作与人类一样方便。 SOAP 是一组具有此目标的 W3C 标准,而 SOAP 专门使用 XML。 REST 本身并不是一个标准,而是一种构建 Web 服务的架构风格,它最大限度地利用了 HTTP 和其他 Web 标准。 Richardson 和 Ruby 的 RESTful Web Services (O'Reilly) 是学习 REST 方法的绝佳资源。
        • 是的......但纯粹拥有“WebService”并不意味着它是 REST。 REST 不止于此。但是这个人实际上并不想要完整的 REST,他只想要一个 Web 服务的标准。因此我的回答。
        • 当您使用带有大写字母的“Web Service”短语时,假定您在谈论 SOAP、WSDL 等。这与 REST 无关,因此与问题无关。您从哪里得到 OP“实际上并不想要完整的 REST”的印象?
        • 因为他引用了 Google API,它不是“完整”的 REST,正如其页面上所说的那样:“将 HTTP 请求用于发布和编辑协议的做法符合 REST 的精神Web 服务接口的方法。”。这是“在精神上”,但不一样。
        猜你喜欢
        • 2020-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多