【发布时间】:2009-10-02 01:53:37
【问题描述】:
当您使用 REST 通过 POST 创建新条目时,我看到一些 API(例如 Google's)指定您将 XML 作为请求的一部分发送,而其他 API 则指定您发送键/值对。 REST POST-s 是否有标准或最佳实践?
【问题讨论】:
当您使用 REST 通过 POST 创建新条目时,我看到一些 API(例如 Google's)指定您将 XML 作为请求的一部分发送,而其他 API 则指定您发送键/值对。 REST POST-s 是否有标准或最佳实践?
【问题讨论】:
任何可行的表示格式都可以,但规定您应该非常努力地使用标准格式,例如存在的 Atom。
更新这是来自 Roy Fielding(HTTP 标准的合著者,在他的博士论文中阐述 REST 的人)的relevant quote。如何设计 Web 服务中使用的表示非常重要:
一个 REST API 应该花费几乎所有 其在定义方面的描述性努力 用于的媒体类型 代表资源 [...]
请务必阅读后续问答。
【讨论】:
这取决于 REST 服务实现者。
如果 REST 服务是对现有 html HTML 表单的改编,则发布键值对通常更容易开始。
从 JavaScript 发布信息时,使用 JSON 通常更容易。
之所以经常使用 XML,是因为它易于人类理解,而且每种语言/平台都有大量工具可以处理它。
【讨论】:
我建议使用最简单的,因为这就是 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;
}
【讨论】:
SOAP 是 WebServices 的标准(我认为您对 WebServices 和 REST 有点困惑)。
但这真的取决于实施者。
【讨论】: