2、对于PERIOD_UNIT参数的说明刘昱琨刘昱琨d修订错误2008-9-22修改在updateContact命令中,对于扩展信息的修改server存在限制,并且更新cnnic的客户端的调用方法刘昱琨刘昱琨2a修订错误2010-11-14修改根据实际应用情况修改文档中API调用错误的代码刘昱琨刘昱琨注:大序号表示用户提出需求变更的次数序号小序号表示每次需求变更引发的变更点的次数序号目录1.引言61.1.编写目的61.2.项目背景61.3.术语与缩写解释61.4.参考资料62.客户端API简介72.1.概述72.2.注意事项72.3.运行要求72.4.客户端API的基本结构73.客户端API各命
3、令调用方法93.1.与server建立SSL连接93.2.hello命令93.2.1.输入参数103.2.2.使用示例103.2.3.返回值说明103.3.login命令103.3.1.输入参数103.3.2.使用示例103.3.3.返回值说明103.4.logout命令113.4.1.输入参数113.4.2.使用示例113.4.3.返回值说明113.5.createDomain命令113.5.1.输入参数123.5.2.使用示例123.5.3.返回值说明133.6.checkDomain命令143.6.1.输入参数143.6.2.使用示例143.6.3.返回值说明143.7.infoDoma
4、in命令153.7.1.输入参数153.7.2.使用示例153.7.3.返回值说明153.8.renewDomain命令173.8.1.输入参数173.8.2.使用示例173.8.3.返回值说明173.9.updateDomain命令183.9.1.输入参数183.9.2.使用示例193.9.3.返回值说明203.10.deleteDomain命令203.10.1.输入参数213.10.2.使用示例213.10.3.返回值说明213.11.transferDomain命令213.11.1.输入参数213.11.2.使用示例213.11.3.返回值说明223.12.createContact命令
5、233.12.1.输入参数233.12.2.使用示例253.12.3.返回值说明253.13.checkContact命令263.13.1.输入参数263.13.2.使用示例263.13.3.返回值说明263.14.infoContact命令273.14.1.输入参数273.14.2.使用示例283.14.3.返回值说明283.15.updateContact命令303.15.1.输入参数303.15.2.使用示例313.15.3.返回值说明333.16.deleteContact命令333.16.1.输入参数333.16.2.使用示例333.16.3.返回值说明333.17.transfer
6、Contact命令333.17.1.输入参数333.17.2.使用示例343.17.3.返回值说明343.18.createHost命令353.18.1.输入参数353.18.2.使用示例353.18.3.返回值说明363.19.checkHost命令363.19.1.输入参数363.19.2.使用示例363.19.3.返回值说明373.20.infoHost命令373.20.1.输入参数383.20.2.使用示例383.20.3.返回值说明383.21.updateHost命令393.21.1.输入参数393.21.2.使用示例403.21.3.返回值说明403.22.deleteHost命
7、令403.22.1.输入参数403.22.2.使用示例413.22.3.返回值说明413.23.pollRequest命令413.23.1.输入参数413.23.2.使用示例413.23.3.返回值说明413.24.pollAck命令423.24.1.输入参数423.24.2.使用示例423.24.3.返回值说明434.联系我们445.附一状态列表456.附二转移操作类型477.附三简写代码说明481.引言1.1.编写目的本文旨描述EPP-04-02英文域名注册系统客户端开发包的使用方法和注册系统中使用的命令输入及其响应。本文主要面向以下对象:l注册系统客户端设计开发人员l注册系
9、。1.3.术语与缩写解释EPP:ExtensibleProvisioningProtocol,可扩展供应协议。在本说明书中,为EPP-04-02版本。Registry:注册管理机构Registrar:注册服务机构,注册商Registrant:注册人,注册申请人RFC:RequestforCommentsIETF:TheInternetEngineeringTaskForceToken:字符串数据类型,按照RFC标准约定。normalizedString:字符串数据类型,按照RFC标准约定。1.4.参考资料1.ExtensibleProvisioningProtoco
10、l2.ExtensibleProvisioningProtocolTransportOverTCP3.ExtensibleProvisioningProtocolDomainNameMapping4.ExtensibleProvisioningProtocolHostMapping5.ExtensibleProvisioningProtocolContactMapping2.客户端API简介2.1.概述CNEPP-04-02API由CNNIC提供给注册服务机构,用于与CNNIC的CN顶极域名注册服务器进行通信。本文档用于说明该AP
11、I的使用方法。包括如何安装,注册系统中使用的命令输入及其响应以及使用示例等等。2.2.注意事项本EPPAPI只提供基本的注册服务,不提供其他功能,比如注册的WEB服务。也就是说,不面向最终的注册用户,注册服务机构可以在此基础上开发新的服务来满足最终用户的需求。熟悉以下语言和协议有助于对EPPAPI的理解和使用:lJAVAlEPP(Extensibleprovisioningprotocol)熟悉以下内容有助于理解本API的实现lXML2.3.运行要求本API需要如下环境进行编译及运行J2SE1.4+Xerces-J-2.9.0Apache-commons-lib2.4.
12、客户端API的基本结构客户端API主要由command包,entity包,response包和transport包组成。其中transport包负责客户端和服务器的通信,是开发上层注册客户端系统主要使用的包,其余各包主要作为对命令对象,协议对象和响应对象的封装使用。客户端API的基本结构如下所示:图21客户端包基本结构Transport包中有2个类,分别是ClientSession.java:负责初始化注册商信息,并和服务器端建立连接通道,以及从建立的通道中发送和接受数据。EppSession.java:通过建立的通道向服务器发送各种EPP命令,接收服务器报文并转换为相应EppRespons
13、e对象。3.客户端API各命令调用方法除客户端与server建立ssl连接以及发送命令时,server返回EppGreeting对象外,其余命令都会返回一个EppResponse类型对象,该对象包含命令的执行结果代码和代码的消息说明以及server端的交易识别号。3.1.与server建立SSL连接/创建一个新的sessionnetnic.edn.registrar.transport.Sessionsession=newnetnic.edn.registrar.transport.Session();SSLContextctx=SSLContext.getInstanc
14、e(TLS);TrustManagerFactorytmf=TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm();KeyManagerFactorykmf=KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm();KeyStoreks=KeyStore.getInstance(JKS);KeyStorets=KeyStore.getInstance(JKS);ks.load(newFileInp
15、utStream(keyStore.getFile(),keyStorePassword.toCharArray();ts.load(newFileInputStream(trustStore.getFile(),trustStorePassword.toCharArray();kmf.init(ks,keyStorePassword.toCharArray();tmf.init(ts);ctx.init(kmf.getKeyManagers(),tmf.getTrustManagers(),null);SSLSocketFactorysocketFactory=ctx.getS
16、ocketFactory();session.setSslSocketFactory(socketFactory);/host与port为注册server的地址与端口EppGreetinggreeting=session.connect(host,port);if(greeting=null)System.out.println(ERROR:cantgetthegreetinginfofromtheserver);elseSystem.out.println(connecttotheserversuccessfully);注:从1.0.3开始session.i
17、nit(Stringconfigfile)方法已经不推荐使用3.2.hello命令Hello命令主要用于保持与server的会话链接。在与server进行会话期间,向server发送命令,server都会返回一个信息。3.2.1.输入参数无。3.2.2.使用示例Hello命令是一个空的元素,使用比较简单,使用示例如下:EppGreetinggreeting=session.hello();3.2.3.返回值说明Hello命令返回的是一个EppGreeting对象,可从中得到以下信息:StringserverId=greeting.getServerID();/取得服务器ID
18、Calendarcal=greeting.getServerDate();/取得服务器当前日历对象EppServiceMenuesm=greeting.getSvcMenu();VectorvectProtocol=esm.getVersion();/取得服务器支持的版本集合VectorvectLang=esm.getLanguage();/取得服务器支持的语言集合VectorvectSrv=esm.getService();/取得服务器所支持的所有对象的名称空间及schema文件位置集合VectorvectUnspec=esm.getUnspec();/取得服务器所支
19、持的所有扩展对象的名称空间及schema文件位置集合3.3.login命令命令用于建立client和server的会话连接以及修改注册商密码。3.3.1.输入参数参数参数类型长度必输说明greetingEppGreeting-Conntect命令得到得EppGreeting对象userStringToken(3-4)注册商IDpwStringToken(6-10)registrar的密码newPWStringToken(6-10)新密码cltridStringToken(3-64)客户端发送的交易识别号3.3.2.使用示例/registrar_id,registrar_passw
20、ord分别为注册商id与注册商密码EppResponseresponse=session.login(greeting,registrar_id,registrar_password,registrar_id+”-”+org.apachemons.lang.RandomStringUtils.randomAlphanumeric(6);如果注册商需要修改密码,需要提供新的密码,可以将上述代码中包含login命令得那句替换为:EppResponseresponse=session.login(greeting,registrar_id,registrar_password
21、,new_password,registrar_id+”-”+org.apachemons.lang.RandomStringUtils.randomAlphanumeric(6);3.3.3.返回值说明返回一个EppResponse对象,包含命令的返回码和说明。if(response=null)System.out.println(cantgettheresponse);returnnull;elseVectorresults=response.getResults();for(inti=0;iresults.size();i+)EppResultres
22、ult=(EppResult)results.get(i);intresultCode=result.getCode();/取得返回码StringresultMsg=result.getMessage().getMsg();/取得返回的消息if(resultCode=1000)System.out.println(executesuccessfully);returnnull;elseSystem.out.println(executefailed!);VectorvectProblem=result.getValue();/取得错误的原因集合3.4.logout命
23、令命令用来结束client端与server端已经建立的会话连接。另外client端如果超过5分钟没有和server通话,server会自动中断会话断开连接。3.4.1.输入参数参数参数类型长度必输说明cltridStringToken(3-64)客户端发送的交易识别号3.4.2.使用示例EppResponseresponse=session.logout(registrar_id+”-”+org.apachemons.lang.RandomStringUtils.randomAlphanumeric(6);3.4.3.返回值说明返回一个EppResponse对象,包含命令的
24、返回码和说明。代码同login命令的返回值说明。3.5.createDomain命令CreateDomain命令用于创建域名。按CNNIC的政策规定,可注册的域名包含:1二级域名(xxx.)。2三级域名(xxx、、、、xxx.ac、xxx.地名)。第1、2类全部可以被注册为企业域名,也就是注册时域名的类型参数为“E”。创建域名时,所引用的技术、管理、付费联系人、注册人、承办人、主机对象等必须在注册库中已经存在,否则拒绝创建域名操作。3.5.1.输入参数createDomain()函数的输入参数如下。参数参数类型长度必输说明fieldsMap-创建d
25、omain对象需要的参数表cltridStringToken(3-64)客户端发送的交易识别号Fields为Map型对象,包含创建域名所需的所有参数:fields内容列表KEYReference参数类型长度必输说明NAMEStringToken(4-255)域名名称PASSWORDStringToken(1-16)域名密码REGISTRANTStringToken(3-16)注册联系人IDPURVEYORStringToken(16)承办联系人ID,该ID必须为CNNIC指定的承办人联系人IDCONTACTVector-包含3个EppContactType对象的VectorNSV
26、ector-包含1-6个nameserver的VectorPERIODStringToken(1-120)注册期限PERIOD_UNITStringToken(1)注册期限类型,其值为以下两种m:按月注册y:按年注册TYPEStringToken(1)域名类型,其值为以下两种E:企业类型域名I:个人类型域名由于注册政策限制,目前仅允许注册企业类型域名注:1.在创建域名时,必须同时指定域名的三种联系人,每种联系人有且只有一个,否则域名不能创建。2.域名的registrant必须为企业类型的联系人或者个人类型的联系人。3.创建域名时必须填写域名承办联系人ID,否则无法创建域名。3.
27、5.2.使用示例/假设这里已经与注册server进行连接并取得了连接的session对象Mapfields=newHashMap();fields.put(NAME,test);fields.put(PASSWORD,12345678);/这里使用的注册者ID以及下面的承办联系人ID以及下面的其他联系人ID都是一个,实际上可以采用多个不同的已注册的联系人ID。fields.put(REGISTRANT,contact-id-2828);/contact-id-2828为注册者idfields.put(PURVEYOR,contact-id-2828);/contact-i
28、d-2828为注册者idEppContactTypecontact1=newEppContactType(contact-id-2828,tech);EppContactTypecontact2=newEppContactType(contact-id-2828,admin);EppContactTypecontact3=newEppContactType(contact-id-2828,billing);Vectorcontacts=newVector();contacts.addElement(contact1);contacts.addElement
29、(contact2);contacts.addElement(contact3);fields.put(CONTACT,contacts);Vectorns=newVector();ns.add(ns1.aaaa);ns.add(ns2.aaaa);fields.put(NS,ns);fields.put(PERIOD_UNIT,y)fields.put(PERIOD,String.valueOf(5);fields.put(TYPE,E);EppResponseresponse=session.createDomain(fields,registrar_id+
31、t=(EppResult)results.get(i);intresultCode=result.getCode();/取得返回码StringresultMsg=result.getMessage().getMsg();/取得返回的消息if(resultCode=1000)System.out.println(executesuccessfully!);EppResponseDataCreateDomainerdcd=(EppResponseDataCreateDomain)response.getResponseData();Stringdomain=erdcd.
33、.使用示例Listdomains=newArrayList();domains.add(“asdf”);domains.add(“asdf”);domains.add(“”);EppResponseresponse=session.checkDomain(domains,registrar_id+”-”+org.apachemons.lang.RandomStringUtils.randomAlphanumeric(16);3.6.3.返回值说明返回一个EppResponseDataCheck对象,其中封装了检查域名的结果。对检查结果采用了一个Has
34、hMap来保存,可以用check方法取得查询结果。if(response=null)System.out.println(cantgettheresponse);returnnull;elseVectorresults=response.getResults();for(inti=0;iresults.size();i+)EppResultresult=(EppResult)results.get(i);intresultCode=result.getCode();/取得返回码StringresultMsg=result.getMessage().get
35、Msg();/取得返回的消息if(resultCode=1000)System.out.println(executesuccessfully!);EppResponseDataCheckDomainerdcd=(EppResponseDataCheckDomain)response.getResponseData();Iteratoriter=erdcd.getHashMap().keySet().iterator();while(iter.hasNext()Stringdomain=(String)iter.next();/取得check的域名StringcheckR
36、esult=erdcd.check(domain);if(EppResponseDataCheck.NOT_FOUND.equals(checkResult)/未注册System.out.println(“notfound”);elseif(EppResponseDataCheck.FOUND.equals(checkResult)/已注册System.out.println(“found”);else/未知System.out.println(“unknown”);elseSystem.out.println(executefailed);VectorvectProblem=resu
38、ang.RandomStringUtils.randomAlphanumeric(16);3.7.3.返回值说明返回一个EppResponseDataInfo对象,其中封装了查询到的域名对象。if(response=null)System.out.println(cantgettheresponse);returnnull;elseVectorresults=response.getResults();for(inti=0;iresults.size();i+)EppResultresult=(EppResult)results.get(i);intres
39、ultCode=result.getCode();/取得返回码StringresultMsg=result.getMessage().getMsg();/取得返回的消息if(resultCode=1000)System.out.println(executesuccessfully!);EppResponseDataInfoeppResponseDataInfo=(EppResponseDataInfo)response.getResponseData();EppDomaineppDomain=(EppDomain)eppResponseDataInfo.getObjec
40、t();/获得EppDomain对象Stringdomain=eppDomain.getName();/取得域名名称Stringroid=eppDomain.getRoid();/取得域名的roidStringserial=roid.replace(s,.);/转换为域名序列号if(!eppDomain.getStatus().isEmpty()/取得域名状态for(Iteratoriter=eppDomain.getStatus().iterator();iter.hasNext();)EppStatuseppStatus=(EppStatus)iter.ne
41、xt();StringstatusStr=eppStatus.getStatus();Stringregistrant=eppDomain.getRegistrant();/取得注册联系人if(!eppDomain.getContact().isEmpty()/取得其他3类联系人VectorallContact=eppDomain.getContact();VectoradminContact=EppContactType.getContactId(allContact,admin);VectortechContact=EppContactType.ge
42、tContactId(allContact,tech);VectorbillingContact=EppContactType.getContactId(allContact,billing);StringadminContactId=(String)(adminContact.get(0);StringtechContactId=(String)(techContact.get(0);StringbillingContactId=(String)(billingContact.get(0);if(!eppDomain.getNameServer().isEmpty()
43、/取得域名关联的域名服务器for(Iteratoriter=eppDomain.getNameServer().iterator();iter.hasNext();)Stringnameserver=(String)iter.next();StringregistrarId=eppDomain.getClientId();/取得当前注册商IDStringcreateRegistrarId=eppDomain.getClientIdCreated();/取得创建注册商IDCalendarcreateCal=eppDomain.getDateCreated();/取
45、CntldDomainDatacdd=(CntldDomainData)crdid.getCntldDomainData();StringdomainType=cdd.getType();/取得域名类型StringdomainPurveyor=cdd.getPurveyor();/取得域名承办人IDelseSystem.out.println(executefailed);VectorvectProblem=result.getValue();/取得错误的原因集合return;3.8.renewDomain命令在domain创建后,删除前,注册商可对该域名进行续费操作,延长域
47、用示例Calendarcal=Calendar.getInstance();cal.set(Integer.valueOf(expire_year).intValue(),Integer.valueOf(expire_month).intValue()-1,Integer.valueOf(expire_day).intValue();/按年续费EppPeriodperiod=newEppPeriod(Integer.valueOf(renew_year).intValue(),y);EppResponseresponse=session.renewDomain(“asdf
49、results.size();i+)EppResultresult=(EppResult)results.get(i);intresultCode=result.getCode();/取得返回码StringresultMsg=result.getMessage().getMsg();/取得返回的消息if(resultCode=1000)System.out.println(executesuccessfully!);EppResponseDataCreateDomainerdcd=(EppResponseDataCreateDomain)response.getR
51、omain命令。3.9.1.输入参数updateDomain()函数的输入参数如下。参数参数类型长度必输说明nameStringToken(3-255)需要更新的域名fieldsMap-更新域名需要的参数表cltridStringToken(3-64)客户端发送的交易识别号Fields为Map型对象,包含更新域名所需的所有参数:Fields内容列表KEYReference参数类型长度必输说明STATUS_ADDVector-增加的域名状态值;若同时删除域名现有状态,则增加的状态集合不能与删除的状态集合重复STATUS_REMVector-删除的域名状态值,必须为该域名现有状态;若同时增加域名状态,则增加的状态集合不能与删除的状态集合重复NAMESERVER_ADDVector-增加的域名服务器,必须为已经注册的域名服务器;若同时删除域名服务器,则不能与删除的域名服务器集合重复NAMESERVER_REMVector-删除域名服务器,必须为该