Ⅰ Python實現WebService介面(SOAP)
Web Service是一個[平台](https://ke..com/item/平台/1064049)獨立的,低耦合的,自包含的、基於可[編程](https://ke..com/item/編程)的web的應用程序,可使用開放的[XML](https://ke..com/item/XML)([標准通用標記語言](https://ke..com/item/標准通用標記語言/6805073)下的一個子集)[標准](https://ke..com/item/標准/219665)來[描述](https://ke..com/item/描述/8928757)、發布、發現、協調和配置這些應用程序,用於開發分布式的交互操作的[應用程序](https://ke..com/item/應用程序/5985445)。 [1]
Web Service技術, 能使得運行在不同機器上的不同應用無須藉助附加的、專門的第三方軟體或硬體, 就可相互交換數據或集成。依據Web Service規范實施的應用之間, 無論它們所使用的語言、 平台或內部協議是什麼, 都可以相互交換數據。Web Service是自描述、 自包含的可用網路模塊, 可以執行具體的業務功能。Web Service也很容易部署, 因為它們基於一些常規的產業標准以及已有的一些技術,諸如[標准通用標記語言](https://ke..com/item/標准通用標記語言/6805073)下的子集[XML](https://ke..com/item/XML)、HTTP。Web Service減少了應用介面的花費。Web Service為整個企業甚至多個組織之間的業務流程的集成提供了一雀激緩個通用機制。
**SOAP**
SOAP即[簡單對象訪問協議](https://ke..com/item/簡單對象訪問協議)(Simple Object Access Protocol),它是用於交換鉛梁[XML](https://ke..com/item/XML)([標准通用標記語言](https://ke..com/item/標准通用標記語言)下的一個子集)編碼信息的輕量級協議。它有三個主要方面:XML-envelope為描述信息內容和如何處理內容定義了框架,將程序對象編碼成為XML對象的規則,執行[遠程過程調用頃模](https://ke..com/item/遠程過程調用)(RPC)的約定。SOAP可以運行在任何其他[傳輸協議](https://ke..com/item/傳輸協議)上。例如,你可以使用 SMTP,即網際網路[電子郵件協議](https://ke..com/item/電子郵件協議)來傳遞SOAP消息,這可是很有誘惑力的。在[傳輸層](https://ke..com/item/傳輸層)之間的頭是不同的,但XML有效負載保持相同。
Web Service 希望實現不同的系統之間能夠用「[軟體](https://ke..com/item/軟體)-軟體對話」的方式相互調用,打破了軟體應用、網站和各種設備之間的格格不入的狀態,實現「基於Web無縫集成」的目標。
使用Python實現服務端
service.py 服務端啟動文件
app.py webservice介面
使用Python實現客戶端
client.py
上面調用的客戶端介面,測試結果如下:
Ⅱ webservice介面密鑰是什麼
1.1.1 驗證碼加密
介面中的驗證碼參數,均需要通過DES + BASE64加密,
1.1.2 報文簽名
通票平台接入端分配一個cp_code和csecret
,雙方均採用如下規則對報文進行簽名:
l 第一步:簽名源串構造規則:將請求參數按照如下規則組織「a=x&b=y&c=z&……」,每一個參數按參數名的自然數序排列。(按字典序排列)
l 第二步:使用HMAC-SHA1加密演算法,將Step1中的到的源串以及實現分缺帶配哪困的密鑰(csecret )進行加密;
l 第三步:將Step2中得到的加密字串進行Base64編碼。
簽名密鑰(secret):abcdefghijklmnopqrstuvwx
/**
* 返李扮念回簽名之後的JSON對象
*
* @param json原JSON對象
* @param secret密鑰
* @return
* @throws Exception
*/
publicstatic String doSign(JSONObjectjson,String secret) throws Exception {
String baseStr = "";
for (Object key : newTreeSet(json.keySet())) {
baseStr += ("&" + key + "=" + json.get(key));
}
SecretKeySpec key = newSecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(key);
byte[] bytes = mac.doFinal(baseStr.substring(1).getBytes("UTF-8"));
json.put("signature", new String(Base64.encodeBase64(bytes)));
return json.toString();
}
Ⅲ JAVA調用C語言發布的webservice介面
Java調用WebService可以直接使用Apache提供的axis.jar自己編寫代碼,或者利用Eclipse自動生成WebService Client代碼,利用其中的Proxy類進行調用。理論上是一樣的,只不過用Eclipse自動生成代碼省事些。
1、編寫代碼方式:
packagecom.yun.test;
importjava.rmi.RemoteException;
importorg.apache.axis.client.Call;
importorg.apache.axis.client.Service;
importorg.apache.axis.message.PrefixedQName;
importorg.apache.axis.message.SOAPHeaderElement;
importcom.cezanne.golden.user.Exception;
importcom.cezanne.golden.user.UserManagerServiceProxy;
importjavax.xml.namespace.QName;
importjava.net.MalformedURLException;
importjavax.xml.rpc.ServiceException;
importjavax.xml.soap.Name;
importjavax.xml.soap.SOAPException;
publicclasstestWebService{
publicstaticStringgetResult()throwsServiceException,MalformedURLException,RemoteException,SOAPException
{
//標識WebService的具體路徑
Stringendpoint="WebService服務地址";
//創建Service實例
Serviceservice=newService();
//通過Service實例創建Call的實例
Callcall=(Call)service.createCall();
//將WebService的服務路徑加入到call實例之中.
call.setTargetEndpointAddress(newjava.net.URL(endpoint));//為Call設置服務的位置
//由於需要認證,故需要設置調用的SOAP頭信息。
NameheaderName=newPrefixedQName(newQName("發布的wsdl里的targetNamespace里的url","string_itemName"));
org.apache.axis.message.SOAPHeaderElementheader=newSOAPHeaderElement(headerName);
header.addTextNode("blablabla");
call.addHeader(header);
//=newSOAPHeaderElement("發布的wsdl里的targetNamespace里的url","SoapHeader");
//soapHeaderElement.setNamespaceURI("發布的wsdl里的targetNamespace里的url");
//try
//{
//soapHeaderElement.addChildElement("string_itemName").setValue("blablabla");
//}
//catch(SOAPExceptione)
//{
//e.printStackTrace();
//}
//call.addHeader(soapHeaderElement);
//調用WebService的方法
org.apache.axis.description.OperationDescoper;
org.apache.axis.description.ParameterDescparam;
oper=neworg.apache.axis.description.OperationDesc();
oper.setName("opName");
param=neworg.apache.axis.description.ParameterDesc(newjavax.xml.namespace.QName("","arg0"),org.apache.axis.description.ParameterDesc.IN,newjavax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema","string"),java.lang.String.class,false,false);
param.setOmittable(true);
oper.addParameter(param);
param=neworg.apache.axis.description.ParameterDesc(newjavax.xml.namespace.QName("","arg1"),org.apache.axis.description.ParameterDesc.IN,newjavax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema","string"),java.lang.String.class,false,false);
param.setOmittable(true);
oper.addParameter(param);
param=neworg.apache.axis.description.ParameterDesc(newjavax.xml.namespace.QName("","arg2"),org.apache.axis.description.ParameterDesc.IN,newjavax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema","string"),java.lang.String.class,false,false);
param.setOmittable(true);
oper.addParameter(param);
oper.setReturnType(newjavax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema","string"));
oper.setReturnClass(java.lang.String.class);
oper.setReturnQName(newjavax.xml.namespace.QName("","return"));
oper.setStyle(org.apache.axis.constants.Style.WRAPPED);
oper.setUse(org.apache.axis.constants.Use.LITERAL);
oper.addFault(neworg.apache.axis.description.FaultDesc(
newjavax.xml.namespace.QName("發布的wsdl里的targetNamespace里的url","Exception"),
"Exception",
newjavax.xml.namespace.QName("發布的wsdl里的targetNamespace里的url","Exception"),
true
));
call.setOperation(oper);
call.setOperationName(newjavax.xml.namespace.QName("發布的wsdl里的targetNamespace里的url","opName"));
//調用WebService,傳入參數
Stringres=(String)call.invoke(newObject[]("arg0","arg1"));
System.out.println("===============");
returnres;
}
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
try{
System.out.println(getResult());
}catch(MalformedURLExceptione){
e.printStackTrace();
}catch(RemoteExceptione){
e.printStackTrace();
}catch(ServiceExceptione){
e.printStackTrace();
}catch(SOAPExceptione){
e.printStackTrace();
}
}
}
2、利用Eclipse自動生成WebService client代碼就容易多了:
首先,new project,選擇other,在輸入框中輸入Web Service Client,選中搜索後的結果,點擊Next,在Service definition中輸入 WebService的發布地址,點擊Finish
這樣,WebService Client代碼已經生成好了。
接下來寫一個Test類,在main函數中輸入如下代碼:
Stringendpoint="伺服器的WebService的地址";
YourWebServiceNameProxyumsp=newYourWebServiceNameProxy(endpoint);
try{
StringresultStr=umsp.opMethod("arg0","arg1");
System.out.println(resultStr);
}catch(Exceptione){
System.out.println("異常");
e.printStackTrace();
}catch(RemoteExceptione){
System.out.println("RemoteException異常");
e.printStackTrace();
}
Ⅳ webservice介面怎麼寫
建議您這邊使用 xfire的動態調用要比較靈活一些。
1、找齊xfire中jar包。
2、弄個main方法,編寫下面幾句代碼:
import org.codehaus.xfire.client.Client;
Client c = new Client(new URL("別人給的地址?WSDL"));
Object[] o = c.invoke("地址中的方法名", new Object[]{參數數組});
System.out.println(o[0].toString());
jar包的話 可以到eclipse中的類庫中去找
如果 webservice中 不傳遞自定義的 bean 上面的代碼就足夠了。
Ⅳ 如何解決WebService參數傳遞中文亂碼問題
很多人在調用WebService所提供方法的時候,發現如果當字元串中含有中文,傳到WebService端就發現是亂碼,這是由於WebService默認的編碼是UTF-8
,當調用端和接收端用不同編碼進行轉換的時候,就會出現此類問題,如何解決這類問題呢,具體要根據你的環境而定。如果WebService的代碼是你可控的,那麼修改起來很簡單,只需要把WebService工程中的web.config文件進行修改,即把使用到utf-8地方改成gb2312就行了。如果WebService的代碼是你不可控的,即你無法去修改WebService工程中的web.config文件,那麼做起來就比較費事了,就是你需要親自把當前字元串轉換成UTF-8的編碼,具體如下:///<summary///Change string from default encoding to UTF-8 encoding///</summary///<param name=sValue
the string to be changed</param///<returns
if changed successfully, return string under UTF-8 encoding;///
else return null///</(stringsValue ){
Encoding def = Encoding.Default;
Encoding unicode = Encoding.UTF8;
// Check whether default encoding is same as UTF-8 encodingif( def == unicode )returnsValue;
// Check parameterif( sValue ==null|| sValue.Length == 0 )returnsValue;
// Convert the string into a byte[].byte[] defBytes = def.GetBytes( sValue );
// Perform the conversion from one encoding to the other.byte[] unicodeBytes = Encoding.Convert( def, unicode, defBytes);char[] uniChars =newchar[ unicodeBytes.Length] ;for(inti = 0; i < unicodeBytes.Length; i++ )
uniChars[i] = (char)(unicodeBytes[i]);returnnewstring( uniChars );}那麼調用WebService之前,需要把含有中文的字元串用以上的函數進行轉換,然後用轉換後的字元串去調用WebService
,就可以避免在WebService中出現亂碼現象。
Ⅵ 怎麼規范的開發webservice介面
以下是操作步驟:
1、編寫服務代碼
服務代碼提供了兩個函數,分別為sayHello和sayHelloToPerson,在HelloService.java類中
2、發布WebService
要將上邊寫的HelloService類發布為WebService,需要先搭建Web應用。下面是在Tomcat下使用Axis創建WebService服務的例子。
3、在Tomcat下創建Web應用
在該例子中,在Tomcat下創建了一個context path為test_webservice的WEB應用。
(1) 在Tomcat的webapps下創建如下文件系統
test_webservice
WEB-INF
lib
Classes
(2)在WEB-INF文件夾下創建web.xml文件,在web.xml中主要是配置axis。
4、復制axis相關的jar文件
將axis的相關jar文件復制到WEB-INF\lib文件夾下。這些文件包括:
activation.jar
axis.jar
axis-ant.jar
axis-schema.jar
commons-discovery-0.2.jar
commons-logging-1.0.4.jar
jaxrpc.jar
log4j-1.2.8.jar
mailapi.jar
saaj.jar
wsdl4j-1.5.1.jar
xmlsec-1.3.0.jar
5、測試發布的WEB應用
啟動Tomcat服務,打開IE瀏覽器,訪問http:host:port/test_webservice/services,
如果看到如下界面就說明AXIS部署成功了。
6、發布WebService
發布WebService需要使用現有的AdminService來實現,這里我寫了一個批處理文件來發布WebService,以後如果需要發布其他文件,只需要修改相應的參數就可以了。
(1)創建deploy.wsdd文件。
(2)創建發布WebService服務的批處理文件deploywebservice.bat。
其中E:\workspace\Libwebservice是存放axis對應的jar文件的文件夾,現在將所有的jar文件都加入到此文件夾中。
-l後的參數是本地要發布WebService的AdminService對應的訪問地址。
最後deploy.wsdd是對應的配置文件名稱。
(3) 將deploy.wsdd文件和deploywebservice.bat文件復制到同一個文件夾下,執行deploywebservice.bat批處理文件,就可以將deploy.wsdd中描述的Java類發布為WebService。發布完成之後再訪問http://host:port/test_webservice/services
Ⅶ java編寫一個webservice介面,介面中的方法參數應該是什麼,返回值呢(急)要求見補充,謝謝啦
private JaxWsProxyFactoryBean getProxyFactory(Class<?> clazz,String address){
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(clazz);
factory.setAddress(address);
return factory;
}
public void save(){
JaxWsProxyFactoryBean factory = getProxyFactory(ProgramVerWebService.class, PROGRAM_VER_WEB_SERVICE_ADDRESS);
ProgramVerWebService service = (ProgramVerWebService)factory.create();
String result = service.getEmpByAccount("abc");
System.out.println(result);
}
本地建立介面,如ProgramVerWebService,然後建立factory調用即可,這里用的是cxf
也可以用axis2通過解析wsdl文件來直接生成本地代碼,調用如下:
stub = new ();
GetEmpByAccountE e = new GetEmpByAccountE();
GetEmpByAccount request = new GetEmpByAccount();
request.setArg0("abc");
e.setGetEmpByAccount(request);
String result = stub.getEmpByAccount(e).getGetEmpByAccountResponse().get_return();
System.out.println(result);