当前位置: 首页 > news >正文

[android]-如何在向服务器发送request时附加已保存的cookie数据

[android]-如何在向服务器发送request时附加已保存的cookie数据

 

应用场景:
在开发android基于手机端+服务器端的应用时,登陆->获取用户信息->获取授权用户相关业务数据(如用户工作任务安排)
,此时就涉及到在登陆后必须把保存有用户已登陆的cookie数据(和服务器端使用cookie或session来判断用户是否登陆没关系,因为这两种方式,在客户端来说,都是通过保存cookie数据来实现的)一同发送到服务器端,不然,服务器端会认为你没有登陆,而不给提供用户工作任务安排的数据

我在工作中就遇到过这问题

一开始我是这样书写代码的

01import java.io.IOException;
02import java.net.SocketTimeoutException;
03import java.util.ArrayList;
04import java.util.List;
05import org.apache.http.HttpResponse;
06import org.apache.http.NameValuePair;
07import org.apache.http.client.methods.HttpPost;
08import org.apache.http.impl.client.AbstractHttpClient;
09import org.apache.http.impl.client.DefaultHttpClient;
10 
11 
12String result = "";
13/* HTTP Post */
14HttpPost httpRequest = new HttpPost(url);
15 
16List<NameValuePair> params = new ArrayList<NameValuePair>();
17params.add(new BasicNameValuePair(para, data));// jsonParameter
18 
19try {
20    // HTTP request
21    httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
22    // HTTP response
23 
24    DefaultHttpClient defaultHttpClient = new DefaultHttpClient();
25    // 请求超时
26    defaultHttpClient.getParams().setParameter(
27            CoreConnectionPNames.CONNECTION_TIMEOUT, 10000);
28    // 读取超时
29    defaultHttpClient.getParams().setParameter(
30            CoreConnectionPNames.SO_TIMEOUT, 10000);
31             
32 
33    // 发送请求
34    HttpResponse httpResponse = defaultHttpClient.execute(httpRequest);
35 
36    // 得到应答的字符串
37    // 200 ok
38    if (httpResponse.getStatusLine().getStatusCode() == 200) {
39        result = EntityUtils.toString(httpResponse.getEntity());
40         
41    }
42catch (ClientProtocolException e) {
43    System.out.println("ClientProtocolException:" + e.toString());
44    e.printStackTrace();
45    return null;
46catch (UnsupportedEncodingException e) {
47    System.out.println("UnsupportedEncodingException:" + e.toString());
48    e.printStackTrace();
49catch (SocketTimeoutException e) {
50    System.out.println("SocketTimeoutException:" + e.toString());
51    e.printStackTrace();
52catch (IOException e) {
53    System.out.println("IOException:" + e.toString());
54    e.printStackTrace();
55}

调用发现登陆成功后在获取工作任务时服务器提示未登陆,看来是没把cookie发送到服务器,由是找资料

修改后如下,有两个类
WebHelperResponse.java

1package com.demo.utils;
2 
3public class WebHelperResponse {
4    public String ResponseText = "";
5    public boolean IsOk = false;
6    public boolean IsError = false;
7    public String ErrMsg = "";
8}

WebHelper.java

view source
 
print ?
001package com.nt.android.app.slorders.utils;
002 
003import java.io.IOException;
004import java.net.SocketTimeoutException;
005import java.util.ArrayList;
006import java.util.List;
007import org.apache.http.HttpResponse;
008import org.apache.http.NameValuePair;
009import org.apache.http.client.CookieStore;
010import org.apache.http.client.entity.UrlEncodedFormEntity;
011import org.apache.http.client.methods.HttpPost;
012import org.apache.http.impl.client.AbstractHttpClient;
013import org.apache.http.impl.client.DefaultHttpClient;
014import org.apache.http.message.BasicNameValuePair;
015import org.apache.http.params.CoreConnectionPNames;
016import org.apache.http.protocol.HTTP;
017import org.apache.http.util.EntityUtils;
018 
019public class WebHelper {
020 
021    private static CookieStore cookieStore;
022 
023    public static WebHelperResponse postJson(String url, String data) {
024        return postData(url, data, "jsondata");
025    }
026 
027    public static WebHelperResponse postXml(String url, String data) {
028        return postData(url, data, "xmldata");
029    }
030 
031    // url参数中不允许有空格,否则将在new HttpPost(url)引发java.lang.IllegalArgumentException错误
032    public static WebHelperResponse postData(String url, String data,
033            String para) {
034        WebHelperResponse m_response = new WebHelperResponse();
035        m_response.IsOk = false;
036        m_response.IsError = false;
037 
038        String result = "";
039        /* HTTP Post */
040        HttpPost httpRequest = new HttpPost(url);
041        // param NameValuePair[]
042        // request.getParameter("name")
043        List<NameValuePair> params = new ArrayList<NameValuePair>();
044        params.add(new BasicNameValuePair(para, data));// jsonParameter
045 
046        try {
047            // HTTP request
048            httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
049            // HTTP response
050 
051            DefaultHttpClient defaultHttpClient = new DefaultHttpClient();
052            // 请求超时
053            defaultHttpClient.getParams().setParameter(
054                    CoreConnectionPNames.CONNECTION_TIMEOUT, 10000);
055            // 读取超时
056            defaultHttpClient.getParams().setParameter(
057                    CoreConnectionPNames.SO_TIMEOUT, 10000);
058            // 添加Cookie
059            if (cookieStore != null) {
060                defaultHttpClient.setCookieStore(cookieStore);
061            }
062 
063            // 发送请求
064            HttpResponse httpResponse = defaultHttpClient.execute(httpRequest);
065            int responseStatusCode = httpResponse.getStatusLine()
066                    .getStatusCode();
067            System.out.println("response statuscode:" + responseStatusCode);
068            // 得到应答的字符串
069            // 200 ok
070            if (responseStatusCode == 200) {
071                result = EntityUtils.toString(httpResponse.getEntity());
072                // 保存Cookie
073                cookieStore = ((AbstractHttpClient) defaultHttpClient)
074                        .getCookieStore();
075 
076                m_response.IsError = false;
077                m_response.IsOk = true;
078                m_response.ResponseText = result;
079 
080            else if (responseStatusCode == 404) {
081                // 找不到页面
082                m_response.IsError = true;
083                m_response.IsOk = false;
084                System.out.println("404:page not found.");
085                m_response.ErrMsg = "不存在此服务,请检查服务器地址配置";
086            else {
087                m_response.IsError = true;
088                m_response.IsOk = false;
089                System.out.println("error,responsestatuscode:"
090                        + responseStatusCode);
091                m_response.ErrMsg = "服务出错";
092            }
093        catch (SocketTimeoutException e) {
094            System.out.println("ClientProtocolException:" + e.toString());
095            e.printStackTrace();
096 
097            m_response.IsError = true;
098            m_response.IsOk = false;
099            m_response.ErrMsg = "连接错误:未能连接到服务器!";
100 
101        catch (IOException e) {
102            System.out.println("ClientProtocolException:" + e.toString());
103            e.printStackTrace();
104 
105            m_response.IsError = true;
106            m_response.IsOk = false;
107            m_response.ErrMsg = "错误:服务器未能提供服务!";
108 
109        }
110        return m_response;
111    }
112 
113}

相关文章:

  • 北信源内网安全管理管理系统
  • sharepoint excute power shell
  • python中PyQwt的使用
  • 重载输出操作符()时遇到的问题
  • CentOS 6系统下安装 JDK1.6
  • 安装graylog2日志服务器
  • javascript学习笔记之时间定制器
  • Fedora下安装Retext
  • Concurrent
  • 阿拉伯数字转中文数字表示[PHP]
  • oral_quiz-#扑克牌是不是顺子#
  • Android使用百度地图的注意点
  • 移动互联网金融的全方位服务时代已经到来
  • 再读《精通css》03:引入和注释
  • 长假结束了
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 4. 路由到控制器 - Laravel从零开始教程
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Angular4 模板式表单用法以及验证
  • flask接收请求并推入栈
  • IDEA 插件开发入门教程
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • node-glob通配符
  • Protobuf3语言指南
  • React-Native - 收藏集 - 掘金
  • Vue学习第二天
  • 安装python包到指定虚拟环境
  • 百度小程序遇到的问题
  • 翻译:Hystrix - How To Use
  • 反思总结然后整装待发
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 手写双向链表LinkedList的几个常用功能
  • 我的面试准备过程--容器(更新中)
  • 优化 Vue 项目编译文件大小
  • linux 淘宝开源监控工具tsar
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • 整理一些计算机基础知识!
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​第20课 在Android Native开发中加入新的C++类
  • #etcd#安装时出错
  • (03)光刻——半导体电路的绘制
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (第30天)二叉树阶段总结
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (小白学Java)Java简介和基本配置
  • (转)ObjectiveC 深浅拷贝学习
  • .DFS.
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .Net Redis的秒杀Dome和异步执行