WebService和Http的POST和GET请求区别和示例
web service(SOAP)
Webservice的一个最基本的目的就是提供在各个不同平台的不同应用系统的协同工作能力。
Web service 就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。
SOAP是一种简单基于xml的轻量协议,用户web上交换结构化信息和类型信息。
soap请求是HTTP POST的一个专用版本,遵循一种特殊的xml消息格式Content-type设置为: text/xml任何数据都可以xml化。
本文将通过一个简单的示例讲解和演示Android平台的Web Service开发。
Ksoap2-android简介
在Android平台调用Web Service需要依赖于第三方类库ksoap2,它是一个SOAP Web service客户端开发包,主要用于资源受限制的Java环境如Applets或J2ME应用程序(CLDC/ CDC/MIDP)。认真读完对ksoap2的介绍你会发现并没有提及它应用于Android平台开发,没错,在Android平台中我们并不会直接使用ksoap2,而是使用ksoap2 android。KSoap2 Android 是Android平台上一个高效、轻量级的SOAP开发包,等同于Android平台上的KSoap2的移植版本。
需要引入ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar
//WebService的命名空间 static final String namespace = "http://impl.service.suncreate.com"; //服务器发布的url static final String url = http://10.100.3.41/axis2/services/UploadService;
final String methodName = "upload";
// 函数名 final int sessionID = "111111"; //sessionID //创建HttpTransportSE对象,通过HttpTransportSE类的构造方法可以指定WebService的url
HttpTransportSE transport = new HttpTransportSE(url);
transport.debug = true; //指定WebService的命名空间和函数名 SoapObject soapObject = new SoapObject(namespace, methodName);
//设置调用方法参数的值 soapObject.addProperty("sessionID", sessionID); //sessionID
soapObject.addProperty("data", cds); //cds是需要传递的对象
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER10);
envelope.bodyOut = transport; envelope.setOutputSoapObject(soapObject); //使用call方法调用WebService方法
transport.call(null, envelope);
SoapObject sb = (SoapObject) envelope.bodyIn;
String xmlMessage = sb.toString(); // 获取从服务器端返回的XML字符串
Restful
REST(Representational State Transfer)一种轻量级的Web Service架构,可以完全通过HTTP协议实现。其实现和操作比SOAP和XML-RPC更为简洁,还可以利用缓存Cache来提高响应速度,性能、效率和易用性上都优于SOAP协议。
REST架构对资源的操作包括获取、创建、修改和删除资源的操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法(Verb)
Restful与SOAP的区别
安全性:SOAP会好于restful
效率和易用性(REST更胜一筹)
成熟度(总的来说SOAP在成熟度上优于REST)
HTTP-GET 和 HTTP-POST
HTTP-GET和HTTP-POST是标准协议,他们使用HTTP(超文本传输协议)谓词(谓词是指条件表达式的求值返回真或假的过程。)对参数进行编码并将参数作为名称/值对传递,还使用关联的请求语义。每个协议都包含一系列HTTP请求标头,HTTP请求标头及其他一些信息定义客户端向服务器请求哪些内容,哪个服务器用一系列HTTP响应标头和所请求的数据进行响应。
HTTP-GET 使用 MIME 类型 application/x-www-form-urlencoded(将追加到处理请求的服务器的 URL 中)以 URL 编码文本的形式传递其参数。 URL 编码是一种字符编码形式,可确保传递的参数中包含一致性文本,例如将空格编码为 %20,其它符号转换为%XX,其中XX为该符号以16进制表示的ASCII(或ISO Latin-1)值。 追加的参数也称为查询字符串。
与 HTTP-GET 类似,HTTP-POST 参数也是 URL 编码的。 但是,名称/值对是在实际的 HTTP 请求消息内部传递的,而不是作为 URL 的一部分进行传递。
我们日常网站、系统都是使用这种形式进行访问我们的应用程序。
package cn.roco.manage.service; import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair; public class NewsService { public static final int POST = 1;
public static final int GET = 2;
public static final int HttpClientPost = 3; /**
* 保存数据
*
* @param title
* 标题
* @param length
* 时长
* @param flag
* true则使用POST请求 false使用GET请求
* @return 是否保存成功
* @throws Exception
*/
public static boolean save(String path, String title, String timelength,
int flag) throws Exception {
Map<String, String> params = new HashMap<String, String>();
params.put("title", title);
params.put("timelength", timelength);
switch (flag) {
case POST:
return sendPOSTRequest(path, params, "UTF-8");
case GET:
return sendGETRequest(path, params, "UTF-8");
case HttpClientPost:
return sendHttpClientPOSTRequest(path, params, "UTF-8");
}
return false;
} /**
* 通过HttpClient框架发送POST请求
* HttpClient该框架已经集成在android开发包中
* 个人认为此框架封装了很多的工具类,性能比不上自己手写的下面两个方法
* 但是该方法可以提高程序员的开发速度,降低开发难度
* @param path
* 请求路径
* @param params
* 请求参数
* @param encoding
* 编码
* @return 请求是否成功
* @throws Exception
*/
private static boolean sendHttpClientPOSTRequest(String path,
Map<String, String> params, String encoding) throws Exception {
List<NameValuePair> pairs = new ArrayList<NameValuePair>();// 存放请求参数
if (params != null && !params.isEmpty()) {
for (Map.Entry<String, String> entry : params.entrySet()) {
//BasicNameValuePair实现了NameValuePair接口
pairs.add(new BasicNameValuePair(entry.getKey(), entry
.getValue()));
}
}
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(pairs, encoding); //pairs:请求参数 encoding:编码方式
HttpPost httpPost = new HttpPost(path); //path:请求路径
httpPost.setEntity(entity); DefaultHttpClient client = new DefaultHttpClient(); //相当于浏览器
HttpResponse response = client.execute(httpPost); //相当于执行POST请求
//取得状态行中的状态码
if (response.getStatusLine().getStatusCode() == 200) {
return true;
}
return false;
} /**
* 发送POST请求
*
* @param path
* 请求路径
* @param params
* 请求参数
* @param encoding
* 编码
* @return 请求是否成功
* @throws Exception
*/
private static boolean sendPOSTRequest(String path,
Map<String, String> params, String encoding) throws Exception {
StringBuilder data = new StringBuilder();
if (params != null && !params.isEmpty()) {
for (Map.Entry<String, String> entry : params.entrySet()) {
data.append(entry.getKey()).append("=");
data.append(URLEncoder.encode(entry.getValue(), encoding));// 编码
data.append('&');
}
data.deleteCharAt(data.length() - 1);
}
byte[] entity = data.toString().getBytes(); // 得到实体数据
HttpURLConnection connection = (HttpURLConnection) new URL(path)
.openConnection();
connection.setConnectTimeout(5000);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
connection.setRequestProperty("Content-Length",
String.valueOf(entity.length)); connection.setDoOutput(true);// 允许对外输出数据
OutputStream outputStream = connection.getOutputStream();
outputStream.write(entity); if (connection.getResponseCode() == 200) {
return true;
}
return false;
} /**
* 发送GET请求
*
* @param path
* 请求路径
* @param params
* 请求参数
* @param encoding
* 编码
* @return 请求是否成功
* @throws Exception
*/
private static boolean sendGETRequest(String path,
Map<String, String> params, String encoding) throws Exception {
StringBuilder url = new StringBuilder(path);
url.append("?");
for (Map.Entry<String, String> entry : params.entrySet()) {
url.append(entry.getKey()).append("=");
url.append(URLEncoder.encode(entry.getValue(), encoding));// 编码
url.append('&');
}
url.deleteCharAt(url.length() - 1);
HttpURLConnection connection = (HttpURLConnection) new URL(
url.toString()).openConnection();
connection.setConnectTimeout(5000);
connection.setRequestMethod("GET");
if (connection.getResponseCode() == 200) {
return true;
}
return false;
}
}
---------------------
作者:j_l_k
来源:CSDN
原文:https://blog.csdn.net/l469121903/article/details/50054083?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!
WebService和Http的POST和GET请求区别和示例的更多相关文章
- Http之Get/Post请求区别
Http之Get/Post请求区别 1.HTTP请求格式: <request line> <headers> <blank line> [<request-b ...
- Http中Get/Post请求区别
Http中Get/Post请求区别 (1)get是从服务器上获取数据,post是向服务器传送数据. (1) 在客户端,Get方式在通过URL提交数据,数据在URL中可以看到:POST方式,数据放置 ...
- GET请求与POST请求区别
GET请求与POST请求区别 a:语义: GET:客户端想获取服务器资源 POST:客户端想传递数据给服务器 b:安全级: GET:不安全 POST:不安全 c:数据长度 GET:客户端发送数据最长1 ...
- js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快、简单 post:安全,量大,不缓存)(服务器同步和异步区别:同步:等待服务器响应当中浏览器不能做别的事情)(ajax和jquery一起用的)
js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快.简单 post:安全,量大,不缓存)( ...
- WebService SOAP、Restful和HTTP(post/get)请求区别
web service(SOAP) Webservice的一个最基本的目的就是提供在各个不同平台的不同应用系统的协同工作能力. Web service 就是一个应用程序,它向外界暴露出一个能够通过We ...
- yii2 的request get pos请求 基本用法示例
yii2好久没用了, 基本的都快忘了,赶紧记录一下. 1.普通的get和pst请求 $request = Yii::$app->request; $get = $request->get( ...
- Http的Get/Post请求区别
1.HTTP请求格式: <request line> <headers> <blank line> [<request-body>] 在HTTP请求中, ...
- 普通B/S架构模式同步请求与AJAX异步请求区别(个人理解)
在上次面试的时候有被问到过AJAX同步与异步之间的概念问题,之前没有涉及到异步与同步的知识,所以特意脑补了一下,不是很全面... 同步请求流程:提交请求(POST/GET表单相似的提交操作)---服务 ...
- Java Servlet(九):转发请求与重定向请求区别
转发: <% pageContext.setAttribute("pageContextAttr", "pageContextAttribute"); r ...
随机推荐
- android 一些常用的功能方法代码块
我们这些苦逼的程序员在工作中,每一个老板都希望我们都能把手头的工作做好的,而且是越快越好,那我们要怎么样才能快起来呢?对于开发中常用的代码块无限复做是我们工作中简省时间最有效的途径之一,而下面的这些代 ...
- uwsgi+django架构程序内部无法获取全局变量
近期开发了一个djangoi程序,用django自带的python manage.py runserver 0.0.0.0:80 运行方式无任何问题,但用django+nginx+uwsg部署运行有时 ...
- QUIC和TCP
作者:henrystark henrystark@126.com Blog: http://henrystark.blog.chinaunix.net/ 日期:20140626 本文遵循CC协议:署名 ...
- 【URLOS应用开发基础】10分钟制作一个nginx静态网站环境应用
URLOS开发者功能已上线有一段时间了,目前通过部分开发者的使用体验来看,不得不说URLOS在服务器软件开发效率方面确实有着得天独厚的优势,凭借docker容器技术与其良好的应用生态环境,URLOS必 ...
- PAT甲题题解-1107. Social Clusters (30)-PAT甲级真题(并查集)
题意:有n个人,每个人有k个爱好,如果两个人有某个爱好相同,他们就处于同一个集合.问总共有多少个集合,以及每个集合有多少人,并按从大到小输出. 很明显,采用并查集.vis[k]标记爱好k第一次出现的人 ...
- PAT甲题题解-1110. Complete Binary Tree (25)-(判断是否为完全二叉树)
题意:判断一个节点为n的二叉树是否为完全二叉树.Yes输出完全二叉树的最后一个节点,No输出根节点. 建树,然后分别将该树与节点树为n的二叉树相比较,统计对应的节点个数,如果为n,则为完全二叉树,否则 ...
- 2-Fifteenth Scrum Meeting-20151215
任务安排 成员 今日完成 明日任务 闫昊 修复bug 写完学习进度记录的数据库操作 唐彬 编写与服务器交互的代码 编写与服务器交互的代码 史烨轩 获取视频url 余帆 修复bug 本地路径的 ...
- 20135202闫佳歆--week3 构造一个简单的Linux系统MenuOs--学习笔记
此为个人学习笔记存档 week 3 构造一个简单的Linux系统MenuOs 复习: 计算机有三个法宝:存储程序计算机,函数调用堆栈,中断 操作系统有两把剑: 1.中断上下文的切换,保存现场和恢复现场 ...
- 20135234mqy-——信息安全系统设计基础第十二周学习总结
process environ.c environvar.c consumer.c 管道写端 producer.c 管道读端 testmf.c listargs.c pipedemo.c 管道 pip ...
- Linux内核实验作业四
实验作业:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 20135313吴子怡.北京电子科技学院 [第一部分]使用库函数API来获取用户标识号.库函数为getuid() 代码如下: ...