andrion客户端与服务器通信方式

在app开发中,我们最常见的就是从app客户端向服务端发一个http请求.对于两种基本的web请求方式get和post来说,get请求方式相对比较简单,在此略过不表.本文重点描述一下通过volley进行几种post提交的方式.

1.客户端以普通的post方式进行提交,服务端返回字符串

RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());

StringRequest stringRequest = new StringRequest(Request.Method.POST,httpurl,

    new Response.Listener<String>() {

        @Override

        public void onResponse(String response) {

            Log.d(TAG, "response -> " + response);

        }

    }, new Response.ErrorListener() {

        @Override

        public void onErrorResponse(VolleyError error) {

            Log.e(TAG, error.getMessage(), error);

        }

    }) {

    @Override

    protected Map<String, String> getParams() {

        //在这里设置需要post的参数

              Map<String, String> map = new HashMap<String, String>();  

            map.put("name1""value1");  

            map.put("name2""value2");  

          return params;

    }

};        

requestQueue.add(stringRequest);

2.客户端以json串的post请求方式进行提交,服务端返回json串

RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());

Map<String, String> map = new HashMap<String, String>();  

map.put("name1""value1");  

map.put("name2""value2");  

JSONObject jsonObject = new JSONObject(params);

JsonRequest<JSONObject> jsonRequest = new JsonObjectRequest(Method.POST,httpurl, jsonObject,

    new Response.Listener<JSONObject>() {

        @Override

        public void onResponse(JSONObject response) {

            Log.d(TAG, "response -> " + response.toString());

        }

    }, new Response.ErrorListener() {

        @Override

        public void onErrorResponse(VolleyError error) {

            Log.e(TAG, error.getMessage(), error);

    }

    })

    {

    //注意此处override的getParams()方法,在此处设置post需要提交的参数根本不起作用

    //必须象上面那样,构成JSONObject当做实参传入JsonObjectRequest对象里

    //所以这个方法在此处是不需要的

//    @Override

//    protected Map<String, String> getParams() {                

//          Map<String, String> map = new HashMap<String, String>();  

//            map.put("name1", "value1");  

//            map.put("name2", "value2");  

                

//        return params;

//    }

            

    @Override

    public Map<String, String> getHeaders() {

        HashMap<String, String> headers = new HashMap<String, String>();

        headers.put("Accept""application/json");

        headers.put("Content-Type""application/json; charset=UTF-8");

                

        return headers;

    }

};

requestQueue.add(jsonRequest);

看了上面这段代码,会觉得volley这个框架实在是还不够完善,使用JsonObjectRequest对象提交一个post请求,如果有参数需要提交,就必须以JSONObject的json串方式提交.
如果服务端并不支持这种方式呢?比如常见的spring mvc服务端,就很难支持json的请求方式.
那么我们想实现这个目标,就需要使用下面给出的办法.

3.客户端以普通的post方式进行提交,服务端返回json串
    首先在Activity类里,继承Request实现一个NormalPostRequest类

private class NormalPostRequest extends Request<JSONObject> {

    private Map<String, String> mMap;

    private Listener<JSONObject> mListener;

    public NormalPostRequest(String url, Listener<JSONObject> listener,ErrorListener errorListener, Map<String, String> map) {

        super(Request.Method.POST, url, errorListener);

            

        mListener = listener;

        mMap = map;

    }

    

    //mMap是已经按照前面的方式,设置了参数的实例

    @Override

    protected Map<String, String> getParams() throws AuthFailureError {

        return mMap;

    }

    

    //此处因为response返回值需要json数据,和JsonObjectRequest类一样即可

    @Override

    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {

        try {

            String jsonString = new String(response.data,HttpHeaderParser.parseCharset(response.headers));

                

            return Response.success(new JSONObject(jsonString),HttpHeaderParser.parseCacheHeaders(response));

        catch (UnsupportedEncodingException e) {

            return Response.error(new ParseError(e));

        catch (JSONException je) {

            return Response.error(new ParseError(je));

        }

    }

    @Override

    protected void deliverResponse(JSONObject response) {

        mListener.onResponse(response);

    }

}

接下来的调用方式和前面差不多,生成一个Request实例,加入队列中即可.

RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());

Request<JSONObject> request = new NormalPostRequest(httpurl,

    new Response.Listener<JSONObject>() {

        @Override

        public void onResponse(JSONObject response) {

            Log.d(TAG, "response -> " + response.toString());

        }

    }, new Response.ErrorListener() {

        @Override

        public void onErrorResponse(VolleyError error) {

            Log.e(TAG, error.getMessage(), error);

        }

    }, params);

requestQueue.add(request);

时间: 2024-10-07 15:56:28

andrion客户端与服务器通信方式的相关文章

Socket 通信原理(Android客户端和服务器以TCP&amp;&amp;UDP方式互通)

ZERO.前言 有关通信原理内容是在网上或百科整理得到,代码部分为本人所写,如果不当,还望指教. 一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据.而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求. 那么,什么是s

OPC协议解析-OPC客户端与服务器通讯解析

1      OPC服务器 OPC服务器, 是指按照OPC基金组织规定的OPC规范群开发的软件驱动.OPC服务器作为中间媒介负责从数据源读取数据再跟另外一端的客户端通信.在 OPC客户端/服务器 的结构图中, 通信的发起端是, 也只能是OPC客户端.客户端和服务器的对话是双向的, 也就是说, 客户端既可以从服务器读出也可以向服务器写入. TOPC基金会定义了四种不同类型的OPC服务器.他们分别是: OPC数据访问服务器(OPC DA) – 它基于 OPC数据访问规范, 是一种为实时数据通讯特别定

用java语言构建一个网络服务器,实现客户端和服务器之间通信,实现客户端拥有独立线程,互不干扰

服务器: 1.与客户端的交流手段多是I/O流的方式 2.对接的方式是Socket套接字,套接字通过IP地址和端口号来建立连接 3.(曾经十分影响理解的点)服务器发出的输出流的所有信息都会成为客户端的输入流,同时所有客户端的所有输出流都会包含在服务器的输入流中. (即套接字即使建立连接,输入输出流都是相对自己的而言的,向外发送自己的内部的信息都用输出流,接受外部的数据都使用输入流!) 简单服务器的代码实现: public static void main(String [] args){ try

介绍一款chrom浏览器插件 DHC是一款使用chrome模拟REST客户端向服务器发送测试数据的谷歌浏览器插件

先打个小广告哈 公司招java架构师,月薪25K以上,负责电商平台架构工作,工作地点在北京 1号线永安里站 附近,如有意向 请把简历发我邮箱[email protected] 可以内部推荐. DHC是一款使用chrome模拟REST客户端向服务器发送测试数据的谷歌浏览器插件. DHC的开发背景 在web开发中,服务器端和客户端的开发和测试必不可少,但是测试的工作往往需要服务器端完成之后,客户端才能进行测试,这无疑延后了测试流程,导致服务器端开发完成后,无法进行充分的数据测试,很容易造成服务器端和

java实现客户端向服务器发送文件的操作

服务器源代码: import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket;

10、使用TCP协议完成一个客户端一个服务器。客户端从键盘输入读取一个字符串,发送到服务器。 服务器接收客户端发送的字符串,反转之后发回客户端。客户端接收并打印。

/**10.使用TCP协议完成一个客户端一个服务器.客户端从键盘输入读取一个字符串,发送到服务器. 服务器接收客户端发送的字符串,反转之后发回客户端.客户端接收并打印. * 客户端*/ import java.io.*; import java.net.*; public class Test10_Client { public static void main(String[] args) throws Exception { Socket s = new Socket("192.168.0.

Android:解决客户端从服务器上获取数据乱码的方法

向服务器发送HTTP请求,接收到的JSON包为response,用String content = EntityUtils.toString(response.getEntity(),"utf-8");解码还是出现了中文乱码,在后面加了 String name = new String(response.getBytes("iso-8859-1"), "UTF-8"); 也无济于事.想到服务器好像是用URLENCODER编了码的,怀着试一试的态度

Android客户端与服务器交互方式-小结

最近的Android项目开发过程中一个问题困扰自己很长时间,Android客户端与服务器交互有几种方式,最常见的就是webservices和json.要在Android手机客户端与pc服务器交互,需要满足下面几种条件:跨平台.传输数据格式标准.交互方便. 为了与服务器通讯其实无非就两种协议HTTP和TCP,TCP的学习Socket,HTTP的话熟悉一下HTTP协议和相关Java API.而下面的几种方式就是从这两种协议扩展出来的:webservices soap.SSH的JSON(可参考:该链接

客户端和服务器地址前加“/”的不同

最近学习WEB开发这一块,对于客户端和服务器的提交.转发和重定向地址前面加"/"组一个小总结 (1)客户端提交表单是地址 创建表单页面(login.jsp),和一个处理提交数据页面(doLogin.jsp) 表单提交地址前面加"/" ,将会跳转服务器下根目录县的doLogin.jsp页面中,如图地址 表单提交地址前面不加"/",将会跳转到WEB项目的根目录下的doLogin.jsp页面中,如图地址 (2)服务器端转发和重定向 ****未完待续**