今天再讲一下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 cookieif (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 cookiesCookieStore = ((AbstractHttpClient) httpClient).getCookieStore();return result;}
}

需要注意的是,调试过程中,需要先将web API宿主到IIS,并且IIS需要将form身份验证打开。

Android request asp.net web API by Cooki相关推荐

  1. android 调用 asp.net web api,从 .NET 客户端调用 Web API (C#)

    从 .NET 客户端调用 Web API (C#) 11/24/2017 本文内容 此内容适用于以前版本的 .NET. 新开发应该使用 ASP.NET Core. 有关使用 Core Web API ...

  2. (四)Asp.net web api中的坑-【api的返回值】

    (四)Asp.net web api中的坑-[api的返回值] 原文:(四)Asp.net web api中的坑-[api的返回值] void无返回值 IHttpActionResult HttpRe ...

  3. ASP.NET Web API 路由对象介绍

    前言 在ASP.NET.ASP.NET MVC和ASP.NET Web API这些框架中都会发现有路由的身影,它们的原理都差不多,只不过在不同的环境下作了一些微小的修改,这也是根据每个框架的特性来制定 ...

  4. A simple Test Client built on top of ASP.NET Web API Help Page

    Step 1: Install the Test Client package Install the WebApiTestClient package from the NuGet Package ...

  5. ASP.NET Web API Selfhost宿主环境中管道、路由

    ASP.NET Web API Selfhost宿主环境中管道.路由 前言 前面的几个篇幅对Web API中的路由和管道进行了简单的介绍并没有详细的去说明一些什么,然而ASP.NET Web API这 ...

  6. ASP.NET Web API Model-ModelBinder

    ASP.NET Web API Model-ModelBinder 前言 本篇中会为大家介绍在ASP.NET Web API中ModelBinder的绑定原理以及涉及到的一些对象模型,还有简单的Mod ...

  7. 【ASP.NET Web API教程】2.3.3 创建Admin控制器

    原文:[ASP.NET Web API教程]2.3.3 创建Admin控制器 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容. Part 3 ...

  8. [转]Supporting OData Query Options in ASP.NET Web API 2

    本文转自:https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/suppor ...

  9. 通过微软的cors类库,让ASP.NET Web API 支持 CORS

    前言:因为公司项目需要搭建一个Web API 的后端,用来传输一些数据以及文件,之前有听过Web API的相关说明,但是真正实现的时候,感觉还是需要挺多知识的,正好今天有空,整理一下这周关于解决COR ...

最新文章

  1. Python编程入门到实践 - 笔记( 4 章)
  2. SpringBoot中自定义Banner(启动图案)
  3. html的head中的常见元素
  4. 如何启用 SAP Spartacus Guest checkout
  5. Java编程思想学习(一) 一切都是对象
  6. MonoRail学习笔记十八:在VM中可以使用哪些系统变量
  7. 己所不欲,勿施于人的意思,这句话出自哪里?
  8. 服务器内存傲腾基本参数信息,服务器装傲腾内存
  9. java xssf 字体样式_Apache POI字体/Fonts
  10. php如何实现运算符重载,JS怎样实现运算符重载
  11. 在html中函数无效,无法在按钮点击HTML中调用JavaScript函数
  12. 计算机屏显内容超过屏幕了,电脑屏幕超出工作频率范围修复方法
  13. キュリオ / 库利欧
  14. 智商黑洞(门萨Mensa测试)9
  15. HCIP-DATACOM H12-831(1-20)
  16. 以匠心正道,以决心致远:毫末智行的自动驾驶之路
  17. 转载:不可不知的端午习俗
  18. 情境领导者-第六章、产生胜利者 故事
  19. 超融合里的服务器怎么复制文件,整整齐齐的超融合机柜,美好!
  20. 2020春多元统计分析及R语言建模习题

热门文章

  1. 1200亿基层医疗市场的利好政策大盘点
  2. pytest文档46-关于https请求警告问题(InsecureRequestWarning: Unverified HTTPS request is being made)
  3. list存储对象的问题
  4. 平均值mean,众数mode,中值median 和 标准差stddev
  5. 怎么解决WIN7 连接samba连接不上的问题
  6. 非零基础自学Golang 1 前景
  7. pnd1 c语言,c语言强化训练——简易计算器
  8. 标签转换为独热码的三种方法Python
  9. 远程一键打印小票之旅
  10. Java 命令行参数