WebService和Http的POST和GET请求区别和示例

news/2025/2/26 12:10:59

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
版权声明:本文为博主原创文章,转载请附上博文链接!

转载于:https://www.cnblogs.com/waves-a/p/9790502.html


http://www.niftyadmin.cn/n/3354283.html

相关文章

路边石混凝土成型机作业方案与施工注意事项

作为施工项目中的技术实现手段&#xff0c;路边石混凝土成型机在确认需求参数与尺寸后&#xff0c;配合相应模具来根据厚度宽度等定位参数来准确建设作业&#xff0c;以效率和质量为前提作为基准进行快速准确作业&#xff0c;加载在项目中提现是效率高效的保障。 其中对于各施工…

uC/OS学习笔记1

这几天稍微空闲点&#xff0c;看了一下uC/OS&#xff0c;用的教材是人民邮电的《uC/OS-II内核分析、移植与驱动程序开发》&#xff0c;刚开始感觉他写的有点稀里糊涂的&#xff0c;自己理一下头绪。uC/OS看到现在&#xff0c;让我感叹这个系统真的是用空间换取时间的典范&#…

Cache的使用

1.Cache与Session的区别每个用户都有自己单独的Session对象但是放在Cache中的数据是大家共享的 protected void SetCache() { //判断缓存是否为空 if (Cache["UserInfo"] null) { Bll.UserInfoBll userInfobll new Bll.UserInfoBll(); //如果为空了&#xff0c;需要…

uC/OS学习笔记2

引 言&#xff1a;1 uC/OS-II的运行机制  在嵌入式系统的应用中&#xff0c;实时性是一个重要的指标&#xff0c;而优先级翻转是影响系统实时性的重要问题。本文着重分析优先级翻转问题的产生和影响&#xff0c;以及在uC/OS-II中的解决方案。  uC/OS-II采用基于固定优先级的…

java小面试题

1、声明式事务和编程式事物的区别&#xff1a; 编程式事务需要你在代码中直接加入处理事务的逻辑,可能需要在代码中显式调用beginTransaction()、commit()、rollback()等事务管理相关的方法,如在执行a方法时候需要事务处理,你需要在a方法开始时候开启事务,处理完后。在方法结束…

将建设中公路项目的滑模施工节奏和要点掌握

产出公路项目路平石模具的主要步骤目前大多数依赖于施工机械设备&#xff0c;对于建设中的节奏和管理是相互促进的&#xff0c;准确的将建设工作落实是重点&#xff0c;施工的要点落实的要切实有效才行&#xff0c;整体的节奏在于进度的跟进&#xff0c;以及对于建设方面重点工…

施工机械在路平石模具建设方面的质量控制标准

对于质量的控制方面的建设工作&#xff0c;在公路施工中建设方面采用机械设备来实现&#xff0c;在符合了涉及的要求&#xff0c;在制作的过程中和交付的环节进行检查&#xff0c;记录一些对于通用要求有帮助的环节&#xff0c;来实现项目建设的突破和发展。 对于建设路缘石等品…

uC/OS学习比较3

OSTimeDly 在Task中&#xff0c;一般执行一段时间之后调用OSTimeDly推迟一段时间再继续运行&#xff0c;OSTimeDly将本进程从Ready TCBList中删除&#xff0c;然后将Delay的时间设置给OSTCBDly&#xff0c;最后调用OS_Sched进行进程调度。 void OSTimeDly (INT16U ticks) { INT…