今天再讲一下android如何通过Cooki访问需要身份验证的web API。
web API项目中加入如下用于验证身份的Controler:
public class LogonController : ApiController { public bool Post([FromBody]User model) { using (var db = new HereDbContext()) { var query = db.AllUsers.Where((p) => p.Name == model.Name && p.Password == model.Password); if (query.Count() > 0) { // 将客户端验证保存到Cooki中 FormsAuthentication.SetAuthCookie(model.Name, false); return true; } } return false; } }
web API中存在另一个需要身份验证才能使用的API Controler,如下:
[Authorize] public class UsersController : ApiController { public IEnumerable<User> GetAllUsers() { Log.I("GetAllUsers() is called."); using (var db = new HereDbContext()) { return db.AllUsers.ToList(); } } public User GetUserById(int id) { using (var db = new HereDbContext()) { var user = db.AllUsers.FirstOrDefault((p) => p.Id == id); if (user == null) { throw new HttpResponseException(HttpStatusCode.NotFound); } return user; } } public User GetUsersByUid(string uid) { using (var db = new HereDbContext()) { foreach (var user in db.AllUsers) { if (user.UID == uid) { return user; } } } throw new HttpResponseException(HttpStatusCode.NotFound); } public HttpResponseMessage AddUser([FromBody]User user) { if (user == null) { return Request.CreateResponse<string>(HttpStatusCode.Forbidden, "user is null!"); } using (var db = new HereDbContext()) { if (db.AllUsers.Where((p) => string.Equals(p.Name, user.Name)).Count() > 0) { return Request.CreateResponse<string>(HttpStatusCode.Conflict, user.Name + " already existed!"); } db.AllUsers.Add(user); db.SaveChanges(); return Request.CreateResponse<string>(HttpStatusCode.Accepted, user.UID); } } }
如果我们想通过android客户端访问这个需要身份验证web API。我们可以通过如下方式书写客户端:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.List; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.CookieStore; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.impl.client.AbstractHttpClient; import org.apache.http.impl.client.DefaultHttpClient; import android.util.Log; public abstract class HttpHelper { private final static String TAG = "HttpHelper"; private final static String API_URL = "http://your.url/api/"; private static CookieStore sCookieStore; public static String invokePost(String action, List<NameValuePair> params) { try { String url = API_URL + action + "/"; Log.d(TAG, "url is" + url); HttpPost httpPost = new HttpPost(url); if (params != null && params.size() > 0) { HttpEntity entity = new UrlEncodedFormEntity(params, "UTF-8"); httpPost.setEntity(entity); } return invoke(httpPost); } catch (Exception e) { Log.e(TAG, e.toString()); } return null; } public static String invokePost(String action) { return invokePost(action, null); } public static String invokeGet(String action, List<NameValuePair> params) { try { StringBuilder sb = new StringBuilder(API_URL); sb.append(action); if (params != null) { for (NameValuePair param : params) { sb.append("?"); sb.append(param.getName()); sb.append("="); sb.append(param.getValue()); } } Log.d(TAG, "url is" + sb.toString()); HttpGet httpGet = new HttpGet(sb.toString()); return invoke(httpGet); } catch (Exception e) { Log.e(TAG, e.toString()); } return null; } public static String invokeGet(String action) { return invokeGet(action, null); } private static String invoke(HttpUriRequest request) throws ClientProtocolException, IOException { String result = null; DefaultHttpClient httpClient = new DefaultHttpClient(); // restore cookie if (sCookieStore != null) { httpClient.setCookieStore(sCookieStore); } HttpResponse response = httpClient.execute(request); StringBuilder builder = new StringBuilder(); BufferedReader reader = new BufferedReader(new InputStreamReader( response.getEntity().getContent())); for (String s = reader.readLine(); s != null; s = reader.readLine()) { builder.append(s); } result = builder.toString(); Log.d(TAG, "result is ( " + result + " )"); // store cookie sCookieStore = ((AbstractHttpClient) httpClient).getCookieStore(); return result; } }
需要注意的是,调试过程中,需要先将web API宿主到IIS,并且IIS需要将form身份验证打开。
相关推荐
ASP.NET的内置对象介绍 1.Response 2.Request 3.Server 4.Application 5.Session 6.Cooki
“新闻发布系统”用户管理 --修改个人信息 情景分析 用户管理是软件系统的最基本功能,有...自定义验证控件 知识准备 内置对象 ASP.NET提供的内置对象有Page、Request、Response、Application、Session、Server和Cooki
代码如下: protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { HttpCookie cookie = Request.Cookies[“loginInfo”];... tb_loginName.Text = UIHelper.Decrypt(cooki
当我输入网站域名,打开网页后url中会跟一段“乱码” 代码如下:http://www.XXXX.com/(S(jnzpixfqi5rge5rnl45vdb45))/index.aspx 最后在...Trusted_Connection cookieless=”true” timeout=”20″/> 想了一下,cooki
C#写入与读取Cookie C#.Net实例代码
cooki-studios.github.io Web上的Cooki
在最近写的一个Android中需要请求web服务器中的数据,有一个登录Activity,登录后会到MainActivity,这中间登录和MainActivity都需要请求php的jsonapi,所以要在网络请求中保持session的,研究了好半天才搞定。...
Delphi 编写的一个可以获取及修改浏览器中的Cookies的程序
FastAPI + React· cookiecutter模板,用于使用现代堆栈来引导FastAPI和React项目。 产品特点 (Python 3.8) 使用和PyJWT进行JWT身份验证 (使用打字稿) 处理路由 和用于处理身份验证 数据库的 于ORM的 用于...
Cooki扩展 Cooki是一本社会策展杂志。您可以与朋友一起收集自己感兴趣的内容集,并像杂志一样浏览。您也可以通过自愿为重要的帖子提供虚拟货币筹码来表达您的兴趣和支持。 支持语言:English
语言:English Cooki扩展 Cooki是一本社会策展杂志。 您可以与朋友一起收集自己感兴趣的内容集,并像杂志一样浏览。 您也可以通过自愿为重要的帖子提供虚拟货币筹码来表达您的兴趣和支持。
百度指数爬虫程序,通过传入登陆百度指数网页之后,输入网页中的cooki序列和想要查询的关键词即可获得想要时间段的关键词搜索数量,代码简洁可读性强,可根据使用者任务进行重新编辑
cookies的编写,可以实现它和jsp的连接,使用户管理自己的cookies
#CookieGetterSharp 一个允许在 .NET 应用程序中使用浏览器 cookie 的库。 分发CookieGetterSharp,发现的奇怪部分已得到纠正。 目前,我正在创建作为一个新库。我将它推荐给不必担心兼容性的开发人员。 执照 它遵循...
VenenoShell VenenoShell是一个基于PHP的Webshell,可让您管理Web服务器。 您可以在其上创建,修改和删除文件。概述用法克隆git仓库+上传到您的Web服务器或...质量破坏者14.-原木清洁剂15.- FTP客户端16.- Cooki
cookie管理-内存版
Dim AppealNum,AppealCount AppealNum=10 ‘同一IP60秒内请求限制10次 AppealCount=Request.Cookies(“AppealCount”) If AppealCount=”” Then response.Cookies(“AppealCount”)=1 AppealCount=1 ...
请求是单向的,总是必须客户端先发起请求.也就是说,传统的HTTP1.0/1.1协议没有充分利用TCP连接的能力.HTTP协议是无状态的,两个请求是从同一个TCP连接发...HTTP协议缺少ISO7层网络模型中的会话层,动态web应用使用cooki
最新版的网络取书,下载网络小说快速方便。各种文学网站应有尽有,放心使用
简单的AngularJs服务,用于管理登录和注销以及使用基本身份验证来保护服务器API端点。 它提供以下功能: 用于处理登录和注销操作的服务 根据默认为/ api / authentication的可配置服务器端点验证登录 Promise API...