A. System.Runtime.Serialization干什么用
这是一个序列化器,用来将对象序列化为可以通过SOAP传输的字符串。一般用来在使用SOAP协议连接的服务器端和客户端之间传输对象数据时进行压缩(对象-SOAP)和解压缩(SOAP-对象)。
B. soap接口是否可以进行文件传输
webservices接口传输文件目前基本两种方式
1.进行BASE64编码压缩后传递,效率低。
2.通过传输文件名,采用http/ftp等方式进行二次获取。推荐。
目前我们的项目每次传输的文件可能要大于1g的,我们采用的是webservices传递文件名,再根据得到的文件名通过FTP进行获取。
C. c++调用WebService,参数string会有长度限制吗
一般情况下,超过10000字节,就会调用失败,但是这不是字符串长度限制造成的,而是数据量过大,造成在网络在传输时间过长,超出了webservice默认的超时设置,导致调用失败,传统的做法是,数据量过大时要对数据进行压缩,客户端进行解压。或者修改webservice的timeout为较长的时间,或者设置为无穷大。这两种办法可以同时使用。
soap本身就是被序列化的,我觉得尽量不要直接传过大的数据,可以换种方式,如内网可考虑文件形式存储给出文件路径等方式,外网分割成多个包去返回!!
D. 什么是web应用协议 谢谢
应该是WEB服务协议吧。
Web Service支持3种协议来与用户交流数据。这3种协议分别是:
1.HTTP-GET
2.HTTP-POST
3.SOAP
在这3种协议中,HTTP(Hypertext Transfer Protocol)已经是众所周知的协议了,它是XML Web Service数据传输的标准,其中包括使用SOAP传输数据。HTTP将SOAP消息压缩,然后以HTTP传输协议的形式进行网络传输。然而在XML Web Service下使用HTTP-GET和HTTP-POST的时候,事实上是指有关单独使用HTTP调用XML Web Service中的方法的能力,而不使用SOAP。
在HTTP中,GET和POST并不是一种协议,它们是可以用来与Web Service交互的几种方法中的其中两种。然而,这二种方法的传送参数和数据的能力使它们变成了一种简单的,非常适合用来调用XML Web Service的工具。
SOAP是XML Web Service最常用到的连接协议。与HTTP相比,SOAP显的更为复杂,但却拥有更强的接受能力。SOAP是一种以XML为基础的协议,它提供一种将数据打包(Packaging)和编码(Encoding)的方法,以用于网络的数据传输。任意一个用户都可以使用SOAP协议与任何一个XML Web Service进行通信,甚至于这个XML Web Service不是建立在.NET 平台上的,比如说java的,都可以利用SOAP来进行数据传输。因此可见,SOAP也是Language Independent(语言独立性)。
2
HTTP-GET和HTTP-POSTHTTP-GET 和 HTTP-POST 是使用 HTTP(超文本传输协议)谓词以及与之关联的请求语义将参数作为名称/值对编码和传递的标准协议。每个协议都由一系列 HTTP 请求头组成,这些头与一些其他信息一起定义客户端向服务器请求的内容,而在成功时,服务器将用一系列 HTTP 响应头和所请求的数据响应。
E. php中soapClient如何配置
一、Linux下安装soap模块
安装完php后最好保留当时安装的文件,比如usr/local/php-5.3.2
查看soap模块是否安装的办法:在php的安装目录下运行php -m来查看
如:/usr/local/php/bin/php -m |grep ‘soap’
如果没有安装,则进入php的安装源文件夹
cd php-5.3.2/ext/soap
进入后在此运行phpize命令
/usr/local/php/bin/phpize
查看信息是否有出错,没有出错的话运行如下命令:
./configure –with-php-config=/usr/local/php/bin/php-config –enable-soap
然后是安装编译
make
最后是安装
make install
安装好之后会提示soap.so文件的保存路径
编译后的soap.so文件保存在了/usr/local/php/lib/php/extensions/no-debug-non-zts-20111222目录下,接着修改php.ini文件
手工修改:查找/usr/local/php/etc/php.ini中的extension_dir = “./”,默认是注释掉的
修改为extension_dir = “/usr/local/php/lib/php/extensions/no-debug-non-zts-20111222/”
并在此行后增加如下,然后保存:
extension = “soap.so”
重新启动apache,在运行php -m就已经能看到扩展的soap模块了。
如果还要安装扩展别的模块可以以此类推。
二、Windows下安装soap模块
在Windows下可以通过修改php.ini来选择当PHP启动时加载哪些扩展库。也可以在脚本中通过使用 dl()来动态加载。PHP扩展库的DLL文件都具有php_前缀。很多扩展库都内置于Windows版的PHP之中。这意味着要加载这些扩展库不需要额外的DLL文件和extension配置指令。Windows下的PHP扩展库列表列出了需要或曾经需要额外PHP DLL文件的扩展库。
要在php.ini中启用某扩展库,需要去掉该行extension=php_*.dll前的注释符号,将想要加载的扩展库前的分号(;)删除即可。
启用php_soap.dll扩展库
// 将这一行
;extension=php_soap.dll
// 改成这样
extension=php_soap.dll
Note: 如果运行服务器模块版的PHP,在修改了php.ini之后别忘了重新启动web服务器以使其改动生效。
下面是内置的扩展库列表:
php_bz2.dll bzip2压缩函数库
php_calendar.dll 历法转换函数库
php_crack.dll 密码破解函数库
php_ctype.dll ctype家族函数库
php_curl.dll CURL,客户端URL库函数库
php_dba.dll DBA:数据库(dbm 风格)抽象层函数库
php_dbase.dll dBase函数库
php_dbx.dll dbx函数库
php_domxml.dll DOM XML函数库
php_dotnet.dll .NET函数库
php_exif.dll EXIF函数库
php_fbsql.dll FrontBase函数库
php_fdf.dll FDF:表单数据格式化函数库
php_filepro.dll filePro函数库
php_ftp.dll FTP函数库
php_gd.dll GD库图像函数库
php_gd2.dll GD库图像函数库
php_gettext.dll Gettext函数库
php_hyperwave.dll HyperWave函数库
php_iconv.dll ICONV字符集转换
php_ifx.dll Informix函数库
php_iisfunc.dll IIS 管理函数库
php_imap.dll IMAP,POP3 和 NNTP 函数库
php_ingres.dll Ingres II函数库
php_interbase.dll InterBasefunctions
php_java.dll Java函数库
php_ldap.dll LDAP函数库
php_mbstring.dll 多字节字符串函数库
php_mcrypt.dll Mcrypt 加密函数库
php_mhash.dll Mhash函数库
php_mime_magic.dll Mimetype函数库
php_ming.dll Ming函数库(Flash)
php_msql.dll mSQL函数库
php_mssql.dll MSSQL函数库
php_mysql.dll MySQL函数库
php_mysqli.dll MySQLi函数库
php_oci8.dll Oracle 8函数库
php_openssl.dll OpenSSL函数库
php_overload.dll 对象重载函数库
php_pdf.dll PDF函数库
php_pgsql.dll PostgreSQL函数库
php_printer.dll 打印机函数库
php_shmop.dll 共享内存函数库
php_snmp.dll SNMP函数库
php_soap.dll SOAP函数库
php_sockets.dll Socket函数库
php_sybase_ct.dll Sybase函数库
php_tidy.dll Tidy函数库
php_tokenizer.dll Tokenizer函数库
php_w32api.dll W32api函数库
php_xmlrpc.dll XML-RPC函数库
php_xslt.dll XSLT函数库
php_yaz.dll YAZ函数库
php_zip.dll Zip文件函数库
php_zlib.dll ZLib压缩函数库
F. 如何在java REST API中用GZip和Jersey压缩相应
有许多情景当你的REST api提供的相应是非常长的,并且我们都知道传递速度和贷款在移动设备/网络上是多重要。当开发支持REST apis的移动app的时候,我认为首要的性能最优化的点就是需要解决。猜猜是什么?因为响应式文本,因此我们能压缩这些文本。而且随着当前的只能手机和平板的能力,在客户端解压文本应该不是个大问题...因此在这篇文章中,如果你使用java的Jersey构建它,我将介绍你怎么能有选择性的压缩REST API响应,这个Jersey事JAX-RS的映射实现(还有更多)...
1.Jersey过滤器和拦截器
啊,感谢Jersey的强大的过滤器和拦截器特性,这个实现是相当容易的。然后过滤器是主要打算来维护像HTTP headers,URIs和/或HTTP methods的request和response的参数,拦截器是维护实体,通过维护实体的输入/输出流。
但是对于压缩将使用一个GZip WriterInterceptor,一个写拦截器被用于这种情况,在那个类里,实体被写到"wire",当在这种情况中时,它在服务器这边,这就意味着输出一个响应实体。
1.1GZip Writer Interceptor
那让我们来看看我们的GZip Writer Interceptor吧:
GZip Writer Interceptor
package org.codingpedia.demo.rest.interceptors;
import java.io.IOException;
import java.io.OutputStream;
import java.util.zip.GZIPOutputStream;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.WriterInterceptor;
import javax.ws.rs.ext.WriterInterceptorContext;
@Provider
@Compress
public class GZIPWriterInterceptor implements WriterInterceptor {
@Override
public void aroundWriteTo(WriterInterceptorContext context)
throws IOException, WebApplicationException {
MultivaluedMap<String,Object> headers = context.getHeaders();
headers.add("Content-Encoding", "gzip");
final OutputStream outputStream = context.getOutputStream();
context.setOutputStream(new GZIPOutputStream(outputStream));
context.proceed();
}
}
注意:
它实现了WriterInterceptor,这是一个写拦截器的消息体的接口,这个接口包装调用javax.ws.rs.ext.MessageBodyWriter.writeTo
供应商实现WriterInterceptor协议必须要么以编程方式注册进一个JAX-RS运行环境,要么必须用@Provider注解来注解在一个提供商扫描语句期间自动的被JAX-RS运行环境发现。
@Compress是绑定注解的名称,在接下来的段落中我们将更详细的讨论它
“拦截器从WriterInterceptorContext中获得一个输出流并且设置一个新的用原始的GZIP包装器包装的输出流。在所有的拦截器被执行以后,输出流最终设置WriterInterceptorContext将用于序列化实体。在上面的例子中,实体字节将被写到GZIPOutputStream中,这个类将压缩流数据,然后把他们写到原始输出流。原始流总是把数据写到wire中。当拦截器被用在服务器上时,原始输出流会把数据写到底层服务器容器的流中,然后发送响应给客户端。”
“重载方法aroundWriteTo()获取WriterInterceptorContextz作为参数。这个上下文包括请求头参数getters和setters,请求属性,实体,实体流和其它属性;当你压缩你的响应时,你应当设置'Content-Encoding'头位gzip”
1.2 压缩注解
过滤器和拦截器能被绑定名字。名称绑定是一种概念,这种概念就是允许告诉一个JAX-RS的运行时,一个只为特定资源方法的特定的过滤器或者拦截器将被执行。当一个过滤器或者拦截器只对一些特定的资源方法限制,那我们就认为它是名称绑定。过滤器和拦截器没有这样的限制就被称作global。在我们的例子中我们已经构建了@Compress注解:
Compress annotation
package org.codingpedia.demo.rest.interceptors;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import javax.ws.rs.NameBinding;
//@Compress annotation is the name binding annotation
@NameBinding
@Retention(RetentionPolicy.RUNTIME)
public @interface Compress {}
而且用它来标记在资源上的方法,这个方法应该是被压缩的(eg:当GET-ing的时候,所有的博客用PodcastsResource)
@Compress annotation在资源方法上的使用
@Component
@Path("/podcasts")
public class PodcastsResource {
@Autowired
private PodcastService podcastService;
...........................
/*
* *********************************** READ ***********************************
*/
/**
* Returns all resources (podcasts) from the database
*
* @return
* @throws IOException
* @throws JsonMappingException
* @throws JsonGenerationException
* @throws AppException
*/
@GET
@Compress
@Proces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public List<Podcast> getPodcasts(
@QueryParam("orderByInsertionDate") String orderByInsertionDate,
@QueryParam("numberDaysToLookBack") Integer numberDaysToLookBack)
throws IOException,AppException {
List<Podcast> podcasts = podcastService.getPodcasts(
orderByInsertionDate, numberDaysToLookBack);
return podcasts;
}
...........................
}
2.测试
2.1SOAPui
好了,如果你正在用SOAPui测试,你能使用下面的请求违反PodcastsResource
Reqest:
请求例子:
GET http://localhost:8888/demo-rest-jersey-spring/podcasts/?orderByInsertionDate=DESC HTTP/1.1
Accept-Encoding: gzip,deflate
Accept: application/json, application/xml
Host: localhost:8888
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Response:
被压缩的json响应,通过SOAPui自动的解压缩
HTTP/1.1 200 OK
Content-Type: application/json
Content-Encoding: gzip
Content-Length: 409
Server: Jetty(9.0.7.v20131107)
[
{
"id": 2,
"title": "Quarks & Co - zum Mitnehmen",
"linkOnPodcastpedia": "http://www.podcastpedia.org/quarks",
"feed": "http://podcast.wdr.de/quarks.xml",
"description": "Quarks & Co: Das Wissenschaftsmagazin",
"insertionDate": "2014-10-29T10:46:13.00+0100"
},
{
"id": 1,
"title": "- The Naked Scientists Podcast - Stripping Down Science",
"linkOnPodcastpedia": "http://www.podcastpedia.org/podcasts/792/-The-Naked-Scientists-Podcast-Stripping-Down-Science",
"feed": "feed_placeholder",
"description": "The Naked Scientists flagship science show brings you a lighthearted look at the latest scientific breakthroughs, interviews with the world top scientists, answers to your science questions and science experiments to try at home.",
"insertionDate": "2014-10-29T10:46:02.00+0100"
}
]
SOAPui接受Content-type:gzip头,我们在GZIPWriterIntercepter中添加了并且自动的解压了响应并且用人眼可读的方式展示出来。
好了,就这些了。你已经了解了Jersey如何让它直接压缩REST api响应了。
G. MSSoap是什么
Windows技术知识:系统文件夹全面解析
朋友我们每天都在使用Windows,可你对它的系统文件夹熟悉吗?下面的文章中将介绍各种Windows操作系统文件夹的作用。
系统文件夹详解Win9X/Me篇
据说目前Windows9X仍然有很多用户,而Windows Me和Windows9X又很相近。这里就带你走进Windows
9X/Me主要的系统文件夹,将它们看个通透吧。
首先需要明确一个概念,“系统文件夹”指的是存放操作系统主要文件的文件夹,一般在安装操作系统过程中自动创建并将相关文件放在对应的文件夹中,
这里面的文件直接影响系统的正常运行,多数都不允许随意改变。
Command
该文件夹内有很多DOS下的外部命令程序,这些小工具在系统崩溃对于系统的修复很有用,如Bootdisk.Bat文件可以用于在DOS命令行上创建启动盘。
Cookies
“甜饼”文件夹,存放用户浏览某些网站时由网站在你的硬盘上创建的一些个人资料,如用户名、所到过的网址等。
Desktop
桌面文件夹,存放于该文件夹内的文件将直接显示在桌面上。
Downloaded Program Files
存放IE下载文件的文件夹。其中包含了显示已打开过的Web页所需的文件(大部分文件用来运行Web页面上的动画)。
Favorites
“收藏夹”文件夹。我们在IE中将某个网页“添加到收藏夹”,实际上就是将网页的快捷方式存放在该文件夹下,当然也可以在该文件下创建更多的文件夹,以便将收藏分类存放。
Fonts
字体文件夹。系统中所有要用到的字体都存放在此,所以添加新字体除了通过打开控制面板的“字体”窗口中的“安装新字体”项的方式进行以外,
也可以直接将字体文件复制到这里;在此也可删除某些不常用的字体文件(但注意扩展名为.fon的屏幕字体最好不要乱删,以免引起系统不能正常显示)。
Help
帮助文件的存放文件夹。里面包括很多很详细的帮助文件,遇到疑难可多看这些帮助文件,它们对用户会有很多帮助。
History
历史记录文件夹。当在IE浏览器浏览过一个网页时,IE默认会创建一个历史记录信息存放在此。如果不想让他人知道你的浏览行踪,可以删除这个文件夹中的内容。
Offline Web Pages
脱机浏览文件的存放位置。当某个站点被设成允许脱机使用时,就会在该文件夹中生成对应的文件。
Recent
记录最近打开过的文档的文件夹。其中的内容和开始菜单中“文档”项中的内容相对应,所以要想清除最近打开过的文档记录,直接删除该文件夹中的快捷方式即可。
Start Menu
开始菜单文件夹。其中的项目对应开始菜单中的程序项,在该文件夹中可以调整开始菜单项目(如增加、删除、重新分类等)。
Sysbckup
该文件夹用于存放系统对_blank>注册表和系统文件的备份信息。
System
这是系统文件夹,存放了系统中的重要文件(如DLL文件等),一些软件在安装时也会向该文件夹复制文件,因此,随着安装的软件的增加,
此文件夹中的内容也会越来越多。该文件夹内的文件一般不要轻易删除,否则会导致系统错误。
System32
32位的系统文件夹,其中有很多虚拟设备文件(扩展名为VXD),随意删除它们会引起系统出错甚至崩溃。
Temp
临时文件夹,存放系统运行时产生的临时文件。其中的文件通常需要手动进行清理。
Temporary Internet Files
IE的临时文件夹。该文件夹中存放IE浏览网页时所生成的一些内容,当再次打开相同网页时系统会从这里读取,以加快浏览速度。因此适当加大该临时文件夹的空间会使浏览速度更快(在控制面板的“Internet选项”中设置)。
系统文件夹详解Win2000/XP篇
既然说完了win98/Me的系统文件夹那么现在说说流行的Win2000/XP的系统文件夹吧。在_blank>系统安装完成后,默认会生成三个文件夹:“WinNT”(对XP而言则是Windows)、“Documents and Settings”和“Program Files”.
所以我们也将它作为系统文件夹来介绍。同“Win9X/Me”一样,我们仍然只介绍重要的常见的文件夹。
与Win9X/Me相同文件夹的作用在上篇我已经提到了,这里不再赘述了。此处仅介绍与Win9X/Me不同的文件夹。
Connection Wizard:存放“Internet连接向导”用到的文件。
Driver Cache:该文件夹一般还会有i386文件夹,其中存放的是会用到的驱动程序压缩文件(该文件一般有几十兆之多)。
Ime:输入法信息存放该文件夹中。
Prefetch:预读取文件夹。为了加快文件的访问速度,在WinXP中使用了预读取技术,它会将访问过的文件在该文件夹下生成新的信息(扩展名为PF的文件)。
Repair:第一次安装Win2000/XP时系统自动在这里保存AUTOEXEC.BAT,CONFIG.SYS等相关的系统文件。
Resources:存放相关桌面主题的文件夹。
System和System32:尽管这两个文件夹在Win9X/Me中也有,但是,Win2000/XP中几乎所有的系统文件都放在System32下,而system下只存放一些16位的驱动程序及一些软件的共享运行库。
Temp:在Win2000/XP中这个文件夹已经基本不起作用,因为每个用户都有自己专门的临时文件夹(放在“Documents and Settings”下,参见后面的介绍)。
2.“Documents and Settings”文件夹
默认情况下,此文件夹中会有Administrator、All users、Default
、NetworkServiceviwl(它们是WinXP中的“服务管理”程序所创建的,提供给那些作为服务的程序用。如安装Foxmail
1)以“All
①Application
Data文件夹下,就可能有_blank>Microsoft\Word\Startup\文件夹(如果安装过Office,此处存放的是Word启动时要自动打开的文档)。
②“开始”菜单文件夹:存放开始菜单中的部分程序组和快捷方式。
③桌面文件夹:存放些该登录用户的部分桌面项目。
豆仔提示:某个用户“开始”菜单、桌面上的项目包括对应的用户名文件夹下的上述两个文件夹和All Users下面的这两个文件夹的内容。
④Templates:模板文件夹,其中可能有Word、Excel等的模板文件,是用于在点击右键选择“新建”时的参考模板。
⑤共享文档:当然就是你允许共享的那些东东的存放之处了。下面有“共享图像”和“共享音乐”两个文件夹。
2)针对不同的用户,在用户名文件夹下还会有:
Local Internet Files等(作用和Win9X/Me中相同)。
Data\Microsoft\Internet Explorer\Quick Book则是OE的通讯簿,等等。
此外,用户文件夹下也有NetHood、PrintHood、Sendto、收藏夹、桌面等文件夹。
3)如果处于局域网中,当用属于域或工作组的账户登录系统后,在“Documents and Settings”中会有“All Users.windows”(对WinXP)或“All Users.Winnt”(对Win2000)文件夹;
而如果用覆盖方式重新安装过系统,且在安装过程中又设置了与以前相同的用户名,在安装程序在创建用户信息时发现同名的文件夹已经存在,便会自动用“用户名.计算机名”的命名方式来创建新的用户配置信息文件夹。
H. 如何设计soap协议传输附件的接口
没写过web service的东西,是不是提供一种以XML为传输介质的服务?
下面是网上摘抄的
--------------------------------
1 Web Service的传输协议概述
Web Service的传输协议概述在ASP.NET 中,XML Web Service支持3种协议来与用户交流数据。这3种协议分别是:
1.HTTP-GET
2.HTTP-POST
3.SOAP
在这3种协议中,HTTP(Hypertext Transfer Protocol)已经是众所周知的协议了,它是XML Web Service数据传输的标准,其中包括使用SOAP传输数据。HTTP将SOAP消息压缩,然后以HTTP传输协议的形式进行网络传输。然而在XML Web Service下使用HTTP-GET和HTTP-POST的时候,事实上是指有关单独使用HTTP调用XML Web Service中的方法的能力,而不使用SOAP。
在HTTP中,GET和POST并不是一种协议,它们是可以用来与Web Service交互的几种方法中的其中两种。然而,这二种方法的传送参数和数据的能力使它们变成了一种简单的,非常适合用来调用XML Web Service的工具。
SOAP是XML Web Service最常用到的连接协议。与HTTP相比,SOAP显的更为复杂,但却拥有更强的接受能力。SOAP是一种以XML为基础的协议,它提供一种将数据打包(Packaging)和编码(Encoding)的方法,以用于网络的数据传输。任意一个用户都可以使用SOAP协议与任何一个XML Web Service进行通信,甚至于这个XML Web Service不是建立在.NET 平台上的,比如说Java的,都可以利用SOAP来进行数据传输。因此可见,SOAP也是Language Independent(语言独立性)。
2
HTTP-GET和HTTP-POSTHTTP-GET 和 HTTP-POST 是使用 HTTP(超文本传输协议)谓词以及与之关联的请求语义将参数作为名称/值对编码和传递的标准协议。每个协议都由一系列 HTTP 请求头组成,这些头与一些其他信息一起定义客户端向服务器请求的内容,而在成功时,服务器将用一系列 HTTP 响应头和所请求的数据响应。
HTTP-GET的处理特征如下:
l
将数据添加到URL。
l
利用一个问号(“?”)代表URL地址的结尾与数据的开端。
l
每一个数据的元素以 名称/值的形式出现。
l
利用一个分号(“;”)来区分多个数据元素。
HTTP-POST的处理特征如下:
l
将数据包括在HTTP主体中。
l
同样的,数据的元素以名称/值的形式出现。
l
但是每一个数据元素分别占用主体的一行。
3
SOAP协议SOAP(Simple Object Access Protocol)简单对象访问协议,它是轻型协议,用于分散的、分布式计算环境中交换信息。SOAP有助于以独立于平台的方式访问对象、服务和服务器。它借助于XML,提供了HTTP所需的扩展。
SOAP协议规范由4个主要的部分组成。
第一部分:SOAP封装(Envelop)定义了一个描述消息的内容多少、谁发送、谁应当接受并且处理以及如何处理它们的框架。
第二部分:SOAP编码规则(Encoding Rules)定义了可选数据编码规则,用于表示应用程序定义的数据类型和直接图表,以及一个用于序列化非语法数据模型统一标准。
第三部分:SOAP RPC表示(RPC Representation)定义一个远程调用风格(请求/响应)信息交换的模式。
第四部分:SOAP绑定(Binding)定义了SOAP和HTTP之间的绑定和使用底层协议的交换。
SOAP协议可以简单地理解为:SOAP=RPC+HTTP+XML,即采用HTTP作为通信协议,RPC作为一致性的调用途径,XML作为数据传送的格式,从而允许服务提供者和服务客户经过防火墙在Internet上进行通信交互。
另外,团IDC网上有许多产品团购,便宜有口碑