3

可以的话请指教。

我正在构建一个 SMS Web 服务 API,它允许人们将 SMS 发送到他们想要的手机号码。一个请求将被发送到接口,然后我们根据提供的帐户详细信息和他们帐户上可用的信用来处理该请求。

对于接口请求,我们提出了两种 XML 结构,我希望您能建议哪一种更好,因为我们正为此争论不休。

接口A

print("<?xml version = "1.0" encoding="UTF-8" standalone="yes"?>
        <Message version="1.0">
            <ClientID>11111</ClientID>
            <PassPhrase>shjfkh</PassPhrase>
            <Request Type="sms" Refno="10" ToAddress="27732687745332">
                <Content>
                      hello world
                </Content>
            </Request>
        </Message> ");

接口 B

 print("<?xml version = "1.0" encoding="UTF-8" standalone="yes"?>
    <Message>
        <mmtag name="Version">1.0</mmtag>
        <mmtag name="ClientID">1001</mmtag>
        <mmtag name="RefNO">120</mmtag>
        <mmtag name="Encoding">base64</mmtag>
        <mmtag name="Type">SMS</mmtag>
        <mmtag name="Content">hello world</mmtag>
        <mmtag name="MSISDN">27781010102</mmtag>        
    </Message>");

现在,看看这两个例子,你认为哪个最适合我们的 API 接口,不管后端的技术如何。如果您选择一个,请支持您的答案。

4

8 回答 8

4

接口 A。

接口 B 本质上只是一个键/值列表,其中接口 A 利用 XML 的结构化特性并通过结构提供意义。

例如:ClientId 是 Message 的属性,而不是 Request 本身。从 A 可以清楚地看到这一点,但从 B 看却不是。

于 2008-12-01T23:18:17.080 回答
2

我会进一步修改A...

<Message version="1.0" clientID="11111" passPhrase="shjfkh">
    <Request Type="sms" Refno="10" ToAddress="27732687745332">hello world</Request>
</Message>

这允许该结构暗示每个消息块有多个消息的可能性。

<Message version="1.0" clientID="11111" passPhrase="shjfkh">
    <Request Type="sms" Refno="10" ToAddress="27732687745332">hello john</Request>
    <Request Type="sms" Refno="11" ToAddress="12345678901234">hello jane</Request>
</Message>
于 2008-12-01T23:06:37.943 回答
2

还有一点,您可能应该将实际消息包含在 CDATA 中,以便将其与您的 XML 分开。像这样...

<Message version="1.0" clientID="11111" passPhrase="shjfkh">
    <Request Type="sms" Refno="10" ToAddress="27732687745332"><![CDATA[hello john]]></Request>
    <Request Type="sms" Refno="11" ToAddress="12345678901234"><![CDATA[hello jane]]></Request>
</Message>

这样,如果用户从 XML 角度嵌入非法字符,您将受到保护。

于 2008-12-01T23:12:49.663 回答
2

接口 A 优于接口 B 有几件事:

  • 使用模式/DTD 更容易检查(特别是如果文本内容的类型取决于元素)
  • 结构更清晰
  • 通过 XPath 搜索和通过 XSLT 转换更容易
  • 更容易绑定到类,如果你喜欢这样的事情

当然,你可以通过接口 B 实现上面提到的所有事情,但它会更麻烦。

如果您需要客户端可以填充的任意元数据,您始终可以将具有键/值子元素的元素添加到接口 A。

抛开所有技术原因,我认为界面 A 的设计更美观。在界面B中,标签基本上是没用的,因为它们都是一样的。因此,所有的mmtag琴弦都是自重的。

于 2008-12-01T23:56:34.100 回答
1

接口A。它更短。

于 2008-12-01T22:59:51.750 回答
1

界面 A... 我喜欢标签内容的属性。

于 2008-12-01T23:02:21.683 回答
1

我想说第二种情况更难阅读,因为它在属性中隐藏了实现细节。

于 2008-12-01T23:03:10.387 回答
1

接口 A,出于其他人概述的所有原因。但我建议 ToAddress 是一个元素,允许将相同的消息发送到多个 ToAddress:

<Request Type="sms" Refno="10">
  <To>27732687745332</To>
  <To>1234567890</To>
  <Content>Hello world</Content>
  </Request>

作为一个挑剔的人,我建议属性使用前导小写,元素使用前导大写......但这只是我。

于 2008-12-02T01:32:12.473 回答