本文目錄一覽:
- 1、怎麼在c語言中用socket的方式調用webservice
- 2、如何用c語言實現基於http的webservice
- 3、C++實現webservice
- 4、JAVA調用C語言發佈的webservice接口
- 5、客戶端用C語言調用WebService里的函數
- 6、c++調用WebService,參數string會有長度限制嗎
怎麼在c語言中用socket的方式調用webservice
可以實現,先connect
sockaddr_in server;
if (m_bSockConnected)
{
return TRUE;
}
server.sin_addr.s_addr = inet_addr(m_szHost);
server.sin_family = AF_INET;
server.sin_port = htons((UINT)m_nPort);
if(connect(m_socket, (struct sockaddr*)server, sizeof(server)) == SOCKET_ERROR)
{
m_bSockConnected = FALSE;
m_nLastErrorNo = WSAGetLastError();
MessageBox(0, “請檢網絡和服務器”, “網絡連接錯誤”, 0);
return FALSE;
}
else
{
m_bSockConnected = TRUE;
}
int timeout=30;
setsockopt(m_socket, SOL_SOCKET, SO_RCVTIMEO, (const char*)timeout, sizeof(int));
然後再發送url
char requestHeader[1024]= {0};
char nBuf[36] = {0};
strcpy(requestHeader, “PUT “);
strcat(requestHeader, szUrl);
strcat(requestHeader, “Content-Length=”);
_ui64toa(contentLength + 8, nBuf,10); //額外加了傳輸完成頭的長度是8 strlen(SEND_END_STRING)
strcat(requestHeader, nBuf);
strcat(requestHeader, “FileCount=”);
ltoa(fileCount,nBuf, 10);
strcat(requestHeader, nBuf);
strcat(requestHeader,” HTTP/1.1\r\nContent-Length: “);
_ui64toa(contentLength + 8, nBuf, 10);
strcat(requestHeader,nBuf);
strcat(requestHeader,”\r\nHost: “);
strcat(requestHeader,m_szHost);
strcat(requestHeader,”:”);
itoa(m_nPort,nBuf,10);
strcat(requestHeader,nBuf);
strcat(requestHeader,”\r\nAccept: */*;\r\nAccept-Encoding: gzip,deflate\r\nKeep-Alive: 60000\r\nConnection: keep-alive\r\n\r\n”);
//MessageBox(0, requestHeader, “info”, 0);
char * szUTF8 = NULL;
BOOL bRet = FALSE;
bRet = CCharTransLib::EncodeToUTF8(requestHeader,szUTF8);
if (bRet)
{
if ( (int)strlen(szUTF8) != send(m_socket, szUTF8, strlen(szUTF8), 0))
{
m_nLastErrorNo = GetLastError();
bRet = FALSE;
}
if (szUTF8)
{
delete []szUTF8;
szUTF8 = NULL;
}
}
以上是從我工程裏面摘的,可能有些變量樓主編譯不過去,但基本思想就是這樣的
如何用c語言實現基於http的webservice
package com.yudun.test;
import java.rmi.RemoteException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.message.PrefixedQName;
import org.apache.axis.message.SOAPHeaderElement;
import com.cezanne.golden.user.Exception;
import com.cezanne.golden.user.UserManagerServiceProxy;
import javax.xml.namespace.QName;
import java.net.MalformedURLException;
import javax.xml.rpc.ServiceException;
import javax.xml.soap.Name;
import javax.xml.soap.SOAPException;
public class testWebService {
public static String getResult() throws ServiceException, MalformedURLException, RemoteException, SOAPException
{
//標識Web Service的具體路徑
String endpoint = “WebService服務地址”;
// 創建 Service實例
Service service = new Service();
// 通過Service實例創建Call的實例
Call call = (Call) service.createCall();
//將Web Service的服務路徑加入到call實例之中.
call.setTargetEndpointAddress( new java.net.URL(endpoint) );//為Call設置服務的位置
// 由於需要認證,故需要設置調用的SOAP頭信息。
Name headerName = new PrefixedQName( new QName(“發佈的wsdl里的targetNamespace里的url”, “string_itemName”) );
org.apache.axis.message.SOAPHeaderElement header = new SOAPHeaderElement(headerName);
header.addTextNode( “blablabla” );
call.addHeader(header);
// SOAPHeaderElement soapHeaderElement = new SOAPHeaderElement(“發佈的wsdl里的targetNamespace里的url”, “SoapHeader”);
// soapHeaderElement.setNamespaceURI(“發佈的wsdl里的targetNamespace里的url”);
// try
// {
// soapHeaderElement.addChildElement(“string_itemName”).setValue(“blablabla”);
// }
// catch (SOAPException e)
// {
// e.printStackTrace();
// }
// call.addHeader(soapHeaderElement);
//調用Web Service的方法
org.apache.axis.description.OperationDesc oper;
org.apache.axis.description.ParameterDesc param;
oper = new org.apache.axis.description.OperationDesc();
oper.setName(“opName”);
param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName(“”, “arg0”), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName(“, “string”), java.lang.String.class, false, false);
param.setOmittable(true);
oper.addParameter(param);
param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName(“”, “arg1”), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName(“, “string”), java.lang.String.class, false, false);
param.setOmittable(true);
oper.addParameter(param);
param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName(“”, “arg2”), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName(“, “string”), java.lang.String.class, false, false);
param.setOmittable(true);
oper.addParameter(param);
oper.setReturnType(new javax.xml.namespace.QName(“, “string”));
oper.setReturnClass(java.lang.String.class);
oper.setReturnQName(new javax.xml.namespace.QName(“”, “return”));
oper.setStyle(org.apache.axis.constants.Style.WRAPPED);
oper.setUse(org.apache.axis.constants.Use.LITERAL);
oper.addFault(new org.apache.axis.description.FaultDesc(
new javax.xml.namespace.QName(“發佈的wsdl里的targetNamespace里的url”, “Exception”),
“Exception”,
new javax.xml.namespace.QName(“發佈的wsdl里的targetNamespace里的url”, “Exception”),
true
));
call.setOperation( oper );
call.setOperationName(new javax.xml.namespace.QName(“發佈的wsdl里的targetNamespace里的url”, “opName”));
//調用Web Service,傳入參數
String res = ( String ) call.invoke( new Object[](“arg0″,”arg1”));
System.out.println(“===============”);
return res;
}
/**
* @param args
*/
public static void main(String[] args) {
try {
System.out.println(getResult());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
} catch (ServiceException e) {
e.printStackTrace();
} catch (SOAPException e) {
e.printStackTrace();
}
}
}
C++實現webservice
1 C++當然可以實現webservice,這是毋庸置疑的.axis2你知道嗎?本質是運行在tomcat下的一個servlet,分java版本,和C語言版本.官方網站為:,首頁上寫着:
The well known Apache Axis, and the the second generation of it, the Apache Axis2, are two Web Service containers that helps users to create, deploy, and run Web Services.
Axis2 is avaialble in both Java as well as C, languages and details about each version can be found below. 大概意思就是這東西分java版本和C版本,可以方便用戶創建,部署,運行web service.而C++完全是兼容C的.
2 當然需要服務器,可能要實現某個服務吧,至於怎樣為其他平台服務,主要是監聽端口實現解析http協議.
3 你的問題有問題,js不需要拼串成XML,服務器才要拼串,JS是運行在客戶端的,客戶端也不是通過SOAP與服務端進行通訊的,而是根據需要調用的服務的WSDL,提供對應參數,客戶端與服務端的通訊是用http協議的,而通訊方式根據是GET還是POST把相關參數放到HTTP頭或者體中.而web service之間的通訊才可能用得到SOAP.
4 PHP調用web service是非常簡單的,貌似有個函數通過SOAP調用.C++編寫的web service肯定有WSDL,可以根據WSDL描述的端口參數,來調用.
PS1:我沒有做過C++的Web service,只做過java的,但是所有語言都是相同的,基本原理都是一樣的,另外web service最好的做法是對外隱藏的,不能直接調用,應該有個類似調度中心的存在來負責調用,這是一個設計方式. 當然直接調用也是可以的,但這種方式效率不高.
PS2:C++可以做web service,但不是很好,缺乏技術支持,軟件支持,雖然管道過濾器模型不限制過濾器的實現方式,但怎麼說呢,C++就是不適合,畢竟和其他構件存在配合問題,而且開發成本也會相對要高點. 現在主流的是C#和JAVA.
JAVA調用C語言發佈的webservice接口
Java調用WebService可以直接使用Apache提供的axis.jar自己編寫代碼,或者利用Eclipse自動生成WebService Client代碼,利用其中的Proxy類進行調用。理論上是一樣的,只不過用Eclipse自動生成代碼省事些。
1、編寫代碼方式:
package com.yudun.test;
import java.rmi.RemoteException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.message.PrefixedQName;
import org.apache.axis.message.SOAPHeaderElement;
import com.cezanne.golden.user.Exception;
import com.cezanne.golden.user.UserManagerServiceProxy;
import javax.xml.namespace.QName;
import java.net.MalformedURLException;
import javax.xml.rpc.ServiceException;
import javax.xml.soap.Name;
import javax.xml.soap.SOAPException;
public class testWebService {
public static String getResult() throws ServiceException, MalformedURLException, RemoteException, SOAPException
{
//標識Web Service的具體路徑
String endpoint = “WebService服務地址”;
// 創建 Service實例
Service service = new Service();
// 通過Service實例創建Call的實例
Call call = (Call) service.createCall();
//將Web Service的服務路徑加入到call實例之中.
call.setTargetEndpointAddress( new java.net.URL(endpoint) );//為Call設置服務的位置
// 由於需要認證,故需要設置調用的SOAP頭信息。
Name headerName = new PrefixedQName( new QName(“發佈的wsdl里的targetNamespace里的url”, “string_itemName”) );
org.apache.axis.message.SOAPHeaderElement header = new SOAPHeaderElement(headerName);
header.addTextNode( “blablabla” );
call.addHeader(header);
// SOAPHeaderElement soapHeaderElement = new SOAPHeaderElement(“發佈的wsdl里的targetNamespace里的url”, “SoapHeader”);
// soapHeaderElement.setNamespaceURI(“發佈的wsdl里的targetNamespace里的url”);
// try
// {
// soapHeaderElement.addChildElement(“string_itemName”).setValue(“blablabla”);
// }
// catch (SOAPException e)
// {
// e.printStackTrace();
// }
// call.addHeader(soapHeaderElement);
//調用Web Service的方法
org.apache.axis.description.OperationDesc oper;
org.apache.axis.description.ParameterDesc param;
oper = new org.apache.axis.description.OperationDesc();
oper.setName(“opName”);
param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName(“”, “arg0”), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName(“”, “string”), java.lang.String.class, false, false);
param.setOmittable(true);
oper.addParameter(param);
param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName(“”, “arg1”), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName(“”, “string”), java.lang.String.class, false, false);
param.setOmittable(true);
oper.addParameter(param);
param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName(“”, “arg2”), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName(“”, “string”), java.lang.String.class, false, false);
param.setOmittable(true);
oper.addParameter(param);
oper.setReturnType(new javax.xml.namespace.QName(“”, “string”));
oper.setReturnClass(java.lang.String.class);
oper.setReturnQName(new javax.xml.namespace.QName(“”, “return”));
oper.setStyle(org.apache.axis.constants.Style.WRAPPED);
oper.setUse(org.apache.axis.constants.Use.LITERAL);
oper.addFault(new org.apache.axis.description.FaultDesc(
new javax.xml.namespace.QName(“發佈的wsdl里的targetNamespace里的url”, “Exception”),
“Exception”,
new javax.xml.namespace.QName(“發佈的wsdl里的targetNamespace里的url”, “Exception”),
true
));
call.setOperation( oper );
call.setOperationName(new javax.xml.namespace.QName(“發佈的wsdl里的targetNamespace里的url”, “opName”));
//調用Web Service,傳入參數
String res = ( String ) call.invoke( new Object[](“arg0″,”arg1”));
System.out.println(“===============”);
return res;
}
/**
* @param args
*/
public static void main(String[] args) {
try {
System.out.println(getResult());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
} catch (ServiceException e) {
e.printStackTrace();
} catch (SOAPException e) {
e.printStackTrace();
}
}
}
2、利用Eclipse自動生成WebService client代碼就容易多了:
首先,new project,選擇other,在輸入框中輸入Web Service Client,選中搜索後的結果,點擊Next,在Service definition中輸入 WebService的發佈地址,點擊Finish
這樣,WebService Client代碼已經生成好了。
接下來寫一個Test類,在main函數中輸入如下代碼:
String endpoint = “服務器的WebService的地址”;
YourWebServiceNameProxy umsp = new YourWebServiceNameProxy (endpoint);
try {
String resultStr = umsp.opMethod(“arg0″,”arg1”);
System.out.println(resultStr);
} catch (Exception e) {
System.out.println(“異常”);
e.printStackTrace();
} catch (RemoteException e) {
System.out.println(“RemoteException異常”);
e.printStackTrace();
}
客戶端用C語言調用WebService里的函數
已經包含進VC頭文件了??
在C語言開頭,#include加載這些文件
需要用的時候就可以直接用了。
C語言是一門通用計算機編程語言,應用廣泛。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。
儘管C語言提供了許多低級處理的功能,但仍然保持着良好跨平台的特性,以一個標準規格寫出的C語言程序可在許多電腦平台上進行編譯,甚至包含一些嵌入式處理器(單片機或稱MCU)以及超級電腦等作業平台。
二十世紀八十年代,為了避免各開發廠商用的C語言語法產生差異,由美國國家標準局為C語言訂定了一套完整的國際標準語法,稱為ANSI C,作為C語言最初的標準。
c++調用WebService,參數string會有長度限制嗎
般情況下,超過10000位元組,就會調用失敗,但是這不是字符串長度限制造成的,而是數據量過大,造成在網絡在傳輸時間過長,超出了webservice默認的超時設置,導致調用失敗,傳統的做法是,數據量過大時要對數據進行壓縮,客戶端進行解壓。或者修改webservice的timeout為較長的時間,或者設置為無窮大。這兩種辦法可以同時使用。
soap本身就是被序列化的,盡量不要直接傳過大的數據,可以換種方式,如內網可考慮文件形式存儲給出文件路徑等方式,外網分割成多個包去返回!!
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/198428.html