Java DNS API、ウィキペディア、ツイッターマラソンが1つのパッケージに

しばらく前、自動ドメイン購入の問題を解決していました。 企業のJavaアプリケーションで使用されるライブラリ(jarおよび設定ファイル)の形式で配置する必要がありました。 パブリックAPIを備えたDNSプロバイダーを探し始めました。 APIをよりシンプルにし、ドメインをより安価にすることが望ましい-このバランスを見つけるのは容易ではありませんでした。

多くのオプションが検討されてきましたが、その一部はstackoverflowにあります。 その後、次の応募者にサークルを絞りました。



多くの人が後者を勧めましたが、これはホスティングプロバイダーであり、DNSのみが必要でした。そこでサーバーを購入しない機会は見つかりませんでした。



私の意見では、最初のものには非常に便利なAPIがあります。認証は一般にHTTPヘッダーX-DNSimple-Tokenを通過できますが、http基本認証を使用した従来のアプローチもあります。 リクエストの形式は非常に単純です-短いURL。 回答はJSONで受け取ることができます(XMLも利用可能)-一般に、価格を除いて、すべてが目を楽しませます-.comドメインの費用は1年あたり14ドルです。 知識のある人は、これが受け入れられないことを理解するでしょう。



http://www.namecheap.com/に対処し始めたとき、すべてがかなり良いことが判明しました。 そして、買い手側-価格は正常であり、10年以上市場に出回っています(dnsimple.com作成者:2010年4月7日17:32:00-小さすぎます。APIで作成したときのドメインIDはエリア3000)。 また、プログラマー側からは、XMLクエリですが、構造はそれほど複雑ではありません。 URL自体のパラメーターによる認証は複雑ではありません。



私が一番気に入ったのは、それらがすべての候補者の中で唯一のサンドボックスであったことです。 テスト環境で登録すると、アカウントに9,000ドルがあり、購入、更新、再アクティブ化などの機能を実際にテストできます。 ドメイン用。 たとえば、DNsimpleでは、クレジットカード番号を入力せずにテスト環境を使用する機会はありませんでしたが、実際のデータなしでは機能しないこのサンドボックスとは何ですか?



さらに、ドメインのホストレコードを編集する場合、非標準値(A、CNAME、AAAAなどだけでなく)を設定できます-「 URL 」もあります -これにより、ドメインから特定のURL(任意)にリダイレクトできます。タスクに必要な時間であり、そのようなオプションがない場合は、顧客のサーバーから何かを発明する必要があります。 すべてのDNSプロバイダーにこの機能があるわけではありません。



また、このプロバイダーは割引クーポンを頻繁に配布し( APIにはこれらのクーポンを使用する機能があります )、プロモーションを編成します(そのうちの1つ-記事の最後)。 たとえば、最近、GoDaddyのSOPAポジションに関連して、GoDaddyからドメインを移行するすべての人に割引があります。



コードに移りましょう


完全にパブリックドメインに配置されています: github.comを使用する必要がある人(ドラムの顧客)。



DNSProviderインターフェースには、NamecheapProviderという特定の実装があります。ここでは、ドメインを操作するための主な機能(購入、レコードの更新、再アクティブ化)があります。 主なエンティティのオブジェクトが配置されているモデルのパッケージがあります:Domain、DomainRecord、RecordType。 それ以外はすべてクエリクラスとxml応答パーサーです。



基本リクエストクラス:

public abstract class DNSBaseRequest { private List<NameValuePair> params = new ArrayList<NameValuePair>(); protected DNSBaseRequest(Properties properties) { params.add(new BasicNameValuePair("ApiUser", properties.getProperty("api.login"))); params.add(new BasicNameValuePair("ApiKey", properties.getProperty("api.key"))); params.add(new BasicNameValuePair("UserName", properties.getProperty("api.login"))); params.add(new BasicNameValuePair("ClientIp", properties.getProperty("client.ip"))); //each class has its own command - his purpose params.add(new BasicNameValuePair("Command", getCommand())); } protected abstract String getCommand(); .... }
      
      







各要求クラスは、目的に対応する独自のgetCommandを実装します



 public class DomainReactivateRequest extends DNSBaseRequest{ public DomainReactivateRequest(String domainName, Properties properties) { super(properties); addParam(new BasicNameValuePair("DomainName", domainName)); } @Override protected String getCommand() { return "namecheap.domains.reactivate"; } }
      
      







パーサーインターフェイス:

 public interface XmlResponseParser<T> { T parse(String xml); }
      
      







そして、アカウントからドメインのリストを取得するための実装例:

 public class DomainsListParser extends DefaultHandler implements XmlResponseParser<ArrayList<Domain>> { private static final Logger log = LoggerFactory.getLogger(DomainsListParser.class); private SAXParser parser; private ArrayList<Domain> result; public DomainsListParser() throws Exception{ SAXParserFactory factory = SAXParserFactory.newInstance(); parser = factory.newSAXParser(); result = new ArrayList<Domain>(); } public ArrayList<Domain> parse(String xml) { try { parser.parse(new InputSource(new StringReader(xml)), this); } catch(Exception e){ log.error("Error in parsing string.", e); } return result; } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if ("Domain".equalsIgnoreCase(qName)){ Domain domain = new Domain(Long.parseLong(attributes.getValue("ID")), attributes.getValue("Name")); domain.setCreateDate(attributes.getValue("Created")); domain.setExpireDate(attributes.getValue("Expires")); result.add(domain); } } }
      
      







互いに、答えをリクエストして解析すると、クラスがジェネリックになります:

 public class ProviderOperator { private static final Logger log = LoggerFactory.getLogger(ProviderOperator.class); private DNSRequestProcessor dnsRequestProcessor; public ProviderOperator(DNSRequestProcessor dnsRequestProcessor) { this.dnsRequestProcessor = dnsRequestProcessor; } public <T, S extends T> T process(DNSBaseRequest dnsRequest, XmlResponseParser<T> parser, S defaultResult) { T result = defaultResult; try { String xml = dnsRequestProcessor.get(dnsRequest); log.debug("Response: {}", xml); result = parser.parse(xml); } catch (Exception e) { log.error("Error in parse", e); } return result; } }
      
      







パラメータを介してそれらを受け取り、xml応答の解析結果を返します。



機能を拡張するには、インターフェイスに関数を追加し、要求クラス、応答パーサークラスを作成し、それぞれProviderOperatorを呼び出してそれらを結合する必要があります。 NamecheapProvider関数。



最後に、興味深い話


www.namecheap.comには伝統があります-毎年、特定のトピックに関するTwitterマラソンを開催しています。 48時間以内に、48の質問が出されます。 1時間ごとに、前の質問に正しい答えが与えられ、次の質問が尋ねられます。 勝者はアカウント(ドメイン購入用)とiPad2のペアにお金を持っています-ほとんどのクイズの中で最も人気のある賞です。 今年、マラソンはスーパーボウルと同時に開催することにしました。 私はアメリカのスポーツが苦手ですが、楽しみのために質問に答えることにしました。 ナンバー3は次のように聞こえます。



「何年にバートスターはウィスコンシンアスレチックホールオブフェイムに選出されましたか」



-ためらうことなく、彼はウィキペディアに行き、彼の伝記を見ました。 別のレビューで、これは1980年に起こったと書かれていました。私はこの数字を返信でツイートしました。 1時間後、正しい答えのツイートが少し動揺しました-1981年。まあ、疑う人は誰でも、ウィキペディアの日付は正確ではないと思いました。 しかし、それでも私は再びそこに行って見ることにしました-私はさらに怒っていました。 1981年、それは本当にそこに書かれていました。私は、視力を改善し、注意を高め、脳をスピードアップするために錠剤を買いだめだと思いました。



しかし、数時間後、マラソンの主催者から次の内容の興味深いツイートが届きました。



「参加者の皆様、ウィキペディアを編集してライバルに誤った情報を与えることは受け入れられないと考えています。これはフェアプレイの精神に反しています。 詐欺の有罪判決は失格になります」



嬉しかった-薬を買うのが早いということだ。



UPDバックライトの破損についてご報告いただきありがとうございます。



All Articles