电信provisioning系统中,常常需要与远程服务器实时交换一些数据,以完成用户的请求。由于简单对象访问协议(Simple Object Access Protocol, SOAP)的流行,许多涉及到第三方的应用,我们一般都比较乐意使用SOAP来开发。不过,由于可能涉及到公司的机密,本系列教程的开发实例尽量采用在网上已经公开的Web Service资源。
上一节,讲解了用iconv解决gSOAP输出的中文文本乱码的问题。在本节中,我们用一个天气预报客户端的例子,简述一下gSOAP输入的中文文本乱码的问题。
Webxml.com.cn提供的天气预报web服务,endpoint地址是:http://webservice.webxml.com.cn/WebServices/WeatherWebService.asmx,大家可以点击进去,查看一下该服务的所有对外提供的接口。其中,利用getWeatherbyCityName接口,可以按给定的城市名字查询该城市的天气预报,如果输入的城市名字不能识别,将统一返回北京的天气预报。
根据前三节的内容,我们可以很快地准备好其客户端存根程序:
1. mkdir –p weather
2. cd weather
3. ../wsdl2h -c -o weather.h http://webservice.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl
4. ../../bin/linux386/soapcpp2 –C –L –x weather.h
由于程序并不复杂,直接给出其源代码:
编译命令是:gcc -O2 -o weather weather.c soapC.c soapClient.c ../../stdsoap2.c -I../.. -L../.. –lgsoap
基本上与上一节的股票信息客户端差不多,唯一不同的是,作为输入参数的城市名字,首先需要iconv转换编码,从GBK转到UTF-8,才可以提交给服务端。各位可以试一下,不作转换的话,无论输入什么,服务端只会返回北京的天气预报,因为传入的参数在服务端产生了乱码。
以下为正常的执行结果,输入广州,可以得到广州的天气预报:
如上图,最后一段的介绍也出现了乱码,不过我认为这是putty的问题,行末的最后一个全角字符,如果只能显示一半的话,下一行开始将产生乱码,如果再遇到一个半角字符,又能显示正常了。