A. C++实现webservice
1 C++当然可以实现webservice,这是毋庸置疑的.axis2你知道吗?本质是运行在tomcat下的一个servlet,分java版本,和c语言版本.官方网站为:http://axis.apache.org/,首页上写着:
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.
B. 如何用C语言开发一个通用web服务器
用C语言开发WEB,可以用C++BUILDER6,称ISAPI,一般人可能做不起来,有点麻烦;
唯一是速度很快,别人看不到源码,掌握了编程套路,也可以开发应用;
缺点:
1。不是解释性语言,做的WEB调试非常麻烦;现在做WEB开发的,用C#、JAVA较多;都是解释性的语言;
2。因为是.DLL的二进制代码,一般商业网站不给予运行的环境,因为网站服务器会被你可能搞瘫,安全性得不到保障;所以,你得自备网页服务器;
3。得不到技术支持,因为没几个人会这种开发;
C. 如何用c编写网页,使网页具有发送数据以及接收数据
网页发送数据接受数据间件职责
用C写网页编译exe文件修改cgi.
其输入输都根据标准输入输完LZ想用虚拟主机执行C语言编写CGI行CGI权限太执行任何操作所买虚拟主机肯定支持C语言编写CGI
CGI接口标准包括标准输入、环境变量、标准输三部
1.标准输入
CGI程序像其执行程序,通标准输入(stdin)Web服务器输入信息,Form数据,所谓向CGI程序传递数据POST意味着操作系统命令行状态执行CGI程序,CGI程序进行调试POST用,本文例,析CGI程序设计、程技巧
2.环境变量
操作系统提供许环境变量,定义程序执行环境,应用程序存取Web服务器CGI接口另外设置自些环境变量,用向CGI程序传递些重要参数CGIGET通 环境变量QUERY-STRING向CGI程序传递Form数据
3.标准输
CGI程序通标准输(stdout)输信息传送给Web服务器传送给Web服务器信息用各种格式,通纯文本或者HTML文本形式,我命令行状态调试CGI程序,并且输
面简单CGI程序,HTMLForm信息直接输We b浏览器
# include <stdio.h>
# include <stdib.h>
main()
{
int i , n ;
printf (〃Content type: text/plain\n\n〃);
n=0;
if(getenv(〃CONTENT-LENGTH〃))
n=atoi(getenv(CONTENT-LENGTH〃));
for (i=0;i<n;i++)
putchar(getchar());
putchar (′\n′);
fflush(stdout);
}
面程序作简要析
prinft (〃Content type :text/plain\n\n〃);
行通标准输字符串〃Content type :text/plain\n\n〃传送给Web服务器MIME信息,告诉Web服务器随输纯ASCII文本形式请注意信息两新行符,Web服务器需要实际文本信息始前先看见空行
if (getenv(〃CONTENT-LENGTH〃))
n=atoi (getenv(〃CONTENT-LENGTH〃));
行首先检查环境变量CONTENT-LENGTH否存Web服务器调用使用POSTCGI程序设置环境变量,文本值表示Web 服务器传送给CGI程序输入字符数目,我使用函数atoi() 环境变量值转换整数,并赋给变量n请注意Web服务器并文件结束符终止输,所检查环境变量CONTENT-LENGTH, CGI程序知道候输入结束
for (i=0;i<n;i++)
putchar(getchar());
行0循环(CONTENT-LENGTH-1)标准输入读每字符直接拷贝标准输,所输入ASCII形式送给Web服务器
通例,我CGI程序般工作程总结几点
1.通检查环境变量CONTENT-LENGTH,确定少输入;
2.循环使用getchar()或者其文件读函数所输入;
3.相应处理输入;
4.通〃Contenttype:〃信息,输信息格式告诉Web服务器;
5.通使用printf()或者putchar()或者其文件写函数,输传送给Web服务器
总,CGI程序主要任务Web服务器输入信息,进行处理,输结再送给Web服务器
D. 如何用c语言实现基于http的webservice
package com.yun.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();
}
}
}
E. c语言可以用于制作网页吗
1、c语言是偏底层的语言,用来做界面的话是比较困难的
2、现在的静态网页设计一般使用Html+CSS,是比较基础的东西,而且很容易上手,但也是必须掌握的。
3、现在主流的网站开发就是Java Web和asp.net。
如果你有java基础可以走Java web的方向。可以用JSP+Servlet+Dao模式就能开发网站,当然SSH框架更加深奥。
而asp.net由于是微软自己开发的软件能很好的在windows平台上运行,用的是C#语言其实也和C语言差不多,因为语言是相通的,你学过一门语言后你就会有那种编程的思想。
asp.net是.NET FrameWork的一部分,是一项微软公司的技术,是一种使嵌入网页中的脚本可由因特网服务器执行的服务器端脚本技术,它可以在通过HTTP请求文档时再在Web服务器上动态创建它们。 指 Active Server Pages(动态服务器页面) ,运行于 IIS(Internet Information Server 服务,是Windows开发的Web服务器)之中的程序 。
4、另外,在进行网站开发时为了提高容错能力,脚本语言是必不可少的,所以javascript或
php也是要懂一点点
F. 有没有用C或c++写的web服务器
C++单独作为应用服务的服务器较少,http服务器有一些的。比如IIS、apache、nginx,d都是基于C/C++的web服务器,国产的有数蚕web服务器,完全使用C++,基于Linux epoll模型。
如果C++服务端要求简单,可以直接基于socket编写。如果通信场景复杂,建议使用成熟的C++网络库,如POCO、cpp-net、boost-asio、数蚕网络通信库。
G. 如何用C++实现支持HTTPS的RESTful WebServer
webservice在企业应用中常常被用作不同系统之间的接口方式。但是如果没有任何安全机制的话,显然是难以委以重任的。比较直接的webservice加密方式就是使用HTTPS方式(SSL证书加密)加密连接,并且只允许持有信任证书的客户端连接,即SSL双向认证。这样就保证了连接来源的可信度以及数据在传输过程中没有被窃取或篡改。通过HTTPS加密方式访问webservice具体方法如下:【准备工作】(1)检查JDK的环境变量是否正确。本文使用JDK1.6(2)准备web服务器,这里选用TOMCAT6.0(3)准备webservice服务端和客户端。【生成证书】这里用到的文件,这里存放在D:/SSL/文件夹内,其中D:/SSL/server/内的文件是要交给服务器用的,D:/SSL/client/内的文件是要交给客户端用的。1生成服务端证书开始-运行-CMD-在dos窗口执行下执行命令:keytool-genkey-v-aliastomcat-keyalgRSA-keystoreD:/SSL/server/tomcat.keystore-dname"CN=127.0.0.1,OU=zlj,O=zlj,L=Peking,ST=Peking,C=CN"-validity3650-storepasszljzlj-keypasszljzlj说明:keytool是JDK提供的证书生成工具,所有参数的用法参见keytool–help-genkey创建新证书-v详细信息-aliastomcat以”tomcat”作为该证书的别名。这里可以根据需要修改-keyalgRSA指定算法-keystoreD:/SSL/server/tomcat.keystore保存路径及文件名-dname"CN=127.0.0.1,OU=zlj,O=zlj,L=Peking,ST=Peking,C=CN"证书发行者身份,这里的CN要与发布后的访问域名一致。但由于这里是自签证书,如果在浏览器访问,仍然会有警告提示。真正场景中建议申请CA机构(wosign)签发的SSL证书更安全。-validity3650证书有效期,单位为天-storepasszljzlj证书的存取密码-keypasszljzlj证书的私钥2生成客户端证书执行命令:keytool‐genkey‐v‐aliasclient‐keyalgRSA‐storetypePKCS12‐keystoreD:/SSL/client/client.p12‐dname"CN=client,OU=zlj,O=zlj,L=bj,ST=bj,C=CN"‐validity3650‐storepassclient‐keypassclient说明:参数说明同上。这里的-dname证书发行者身份可以和前面不同,到目前为止,这2个证书可以没有任何关系。下面要做的工作才是建立2者之间的信任关系。3导出客户端证书执行命令:keytool‐export‐aliasclient‐keystoreD:/SSL/client/client.p12‐storetypePKCS12‐storepassclient‐rfc‐fileD:/SSL/client/client.cer说明:-export执行导出-file导出文件的文件路径4把客户端证书加入服务端证书信任列表执行命令:keytool‐import‐aliasclient‐v‐fileD:/SSL/client/client.cer‐keystoreD:/SSL/server/tomcat.keystore‐storepasszljzl说明:参数说明同前。这里提供的密码是服务端证书的存取密码。5导出服务端证书执行命令:keytool-export-aliastomcat-keystoreD:/SSL/server/tomcat.keystore-storepasszljzlj-rfc-fileD:/SSL/server/tomcat.cer说明:把服务端证书导出。这里提供的密码也是服务端证书的密码。6生成客户端信任列表执行命令:keytool-import-fileD:/SSL/server/tomcat.cer-storepasszljzlj-keystoreD:/SSL/client/client.truststore-aliastomcat–noprompt说明:让客户端信任服务端证书【配置服务端为只允许HTTPS连接】1配置Tomcat目录下的/conf/server.xmlXml代码:说明:在server.xml里面这段内容本来是被注释掉的,如果想使用https的默认端口443,请修改这里的port参数。其中的clientAuth="true"指定了双向证书认证。2配置服务端项目web.xml在之后增加Xml代码:SSL/service/*/*-->SSLrequiredCONFIDENTIAL说明:这里限制了WEBservice服务地址的访问必须为https连接。要根据你的webservice服务地址配置。【修改客户端代码】在执行访问之前,增加Java代码:System.setProperty("javax.net.ssl.trustStore","D:/SSL/client/client.truststore");System.setProperty("javax.net.ssl.trustStorePassword","zljzlj");System.setProperty("javax.net.ssl.keyStoreType","PKCS12");System.setProperty("javax.net.ssl.keyStore","D:/SSL/client/client.p12");System.setProperty("javax.net.ssl.keyStorePassword","client");StringendPoint="ApplyFormService";通过设置参数来指定客户端连接时所使用的客户端证书,这里还可以采用修改JVM启动参数的的方式来执行,但出于不影响其他功能的考虑,这里采用System.setProperty的方式来设置这些参数,在使用结束后,可以还原这些参数配置。做为客户端的开发者,可以把拿到的证书文件后,只执行步骤3。