今天再讲一下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身份验证打开。
相关推荐
.NET ASP.NET教程是微软开发的一款用于构建Web应用程序的框架,它提供了一种高效、安全且易于维护的方式来构建动态网站。本教程课件适用于初学者,旨在帮助他们快速掌握ASP.NET的核心概念和技术。以下是对每个压缩...
在ASP.NET中,有几个核心的内置对象,包括Response、Request、Server、Application和Session,以及Cooki。下面我们将逐一详细介绍这些对象及其主要功能。 1. **Response** 对象: - `Response` 是 `HttpResponse` ...
“新闻发布系统”用户管理 --修改个人信息 情景分析 用户管理是软件系统的最基本功能,有...自定义验证控件 知识准备 内置对象 ASP.NET提供的内置对象有Page、Request、Response、Application、Session、Server和Cooki
`Web.Config`文件是ASP.NET应用的配置文件,它包含应用程序的全局配置,如数据库连接字符串、身份验证模式、授权规则等。在处理Cookie时,可能会在`Web.Config`中配置Cookie的相关设置,比如Cookie的域、路径、安全...
代码如下: 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
在Web开发中,Delphi开发者可能会用到各种库和API来与浏览器交互,其中就包括处理Cookies的代码。 该压缩包中的"www.pudn.com.txt"可能是程序的源代码或相关文档,通常在开发过程中,开发者会将源代码、注释、教程...
cooki-studios.github.io Web上的Cooki
在最近写的一个Android中需要请求web服务器中的数据,有一个登录Activity,登录后会到MainActivity,这中间登录和MainActivity都需要请求php的jsonapi,所以要在网络请求中保持session的,研究了好半天才搞定。...
标题中的“JSP.rar_cookies jsp_jsp_jsp cooki_jsp cookies_jsp 用户管理”表明这个压缩包可能包含了一系列关于使用JSP(JavaServer Pages)处理Cookie的教程或示例代码,主要用于用户管理。描述中提到“cookies的...
request = urllib.request.Request(LOGIN_URL, data, headers) ``` ##### 四、使用Cookie登录 接下来介绍如何使用Cookie来完成登录操作。 1. **获取登录Cookie**: 在完成登录后,服务器通常会返回一个带有登录...
FastAPI + React· cookiecutter模板,用于使用现代堆栈来引导FastAPI和React项目。 产品特点 (Python 3.8) 使用和PyJWT进行JWT身份验证 (使用打字稿) 处理路由 和用于处理身份验证 数据库的 于ORM的 用于...
Cooki扩展 Cooki是一本社会策展杂志。您可以与朋友一起收集自己感兴趣的内容集,并像杂志一样浏览。您也可以通过自愿为重要的帖子提供虚拟货币筹码来表达您的兴趣和支持。 支持语言:English
语言:English Cooki扩展 Cooki是一本社会策展杂志。 您可以与朋友一起收集自己感兴趣的内容集,并像杂志一样浏览。 您也可以通过自愿为重要的帖子提供虚拟货币筹码来表达您的兴趣和支持。
百度指数爬虫程序,通过传入登陆百度指数网页之后,输入网页中的cooki序列和想要查询的关键词即可获得想要时间段的关键词搜索数量,代码简洁可读性强,可根据使用者任务进行重新编辑
#CookieGetterSharp 一个允许在 .NET 应用程序中使用浏览器 cookie 的库。 分发CookieGetterSharp,发现的奇怪部分已得到纠正。 目前,我正在创建作为一个新库。我将它推荐给不必担心兼容性的开发人员。 执照 它遵循...
4. **使用`localStorage`或`sessionStorage`**:在支持这些API的浏览器中,可以使用`localStorage`或`sessionStorage`代替cookie进行数据存储。这些本地存储方法不受同源策略的约束,但请注意它们的存储量有限,且不...
理解并熟练掌握这些操作,可以帮助开发者在构建 Web 应用时有效地管理用户的状态信息,提供更个性化的用户体验。需要注意的是,处理 Cookie 时应考虑到安全性和隐私保护,避免滥用可能导致安全风险。例如,敏感信息...
VenenoShell VenenoShell是一个基于PHP的Webshell,可让您管理Web服务器。 您可以在其上创建,修改和删除文件。概述用法克隆git仓库+上传到您的Web服务器或...质量破坏者14.-原木清洁剂15.- FTP客户端16.- Cooki
cookie管理-内存版