天道酬勤,学无止境

rest

WebApi 中的条件 DataContract 序列化(Conditional DataContract Serialization in WebApi)

问题 我试图找到有条件地在我的 .net WebApi 项目中的数据合同序列化中包含和删除属性的最佳方法。 在我的 Api 中,我希望允许用户指定他们想要返回的字段。 例如,假设我希望我的 API 返回以下类的实例。 public class Car { public int Id { get; set; } public string Year { get; set; } public string Make { get; set; } public string Model { get; set; } public string Color { get; set; } } 但不是请求整个对象,API 调用只需要 Id 和 Make 字段。 所以返回的 JSON 将是 { "Id": 12345, "Make": "Ford"} 而不是整个对象。 是否可以使用 DataContract Serializer 有条件地从返回对象中添加和删除属性? **编辑我已经查看了 IgnoreDefault 属性,我不相信它会完全满足我的需要。 问题是我想根据 api 请求包含和排除属性,不一定取决于它们是否有数据。 有没有办法挂钩反序列化过程并跳过某些属性? 我可以做某种定制合同吗? 回答1 如果您使用的是DataContractSerializer (或者

2021-12-09 02:41:58    分类:技术分享    .net   rest   serialization   datacontractserializer   asp.net-web-api

PHP REST API 认证(PHP rest API authentication)

问题 我正在为 php 应用程序构建一个安静的 API。 目前,API 只会接受和响应 json。 请求、路由和响应都由框架处理,但我需要构建自定义身份验证机制。 为了额外的安全性和避免重放攻击,我想添加两个项目:时间戳和随机数。 除了这两项之外,我还需要进行完整性检查,以确保我没有遗漏任何从安全性或可用性角度来看非常明显的内容。 entity_id 应该放在标题而不是请求中吗? 到目前为止,这是我用于身份验证的内容: function authenticate_request() { $request = json_decode(file_get_contents('php://input')); $request_headers = apache_request_headers(); if ( ! isset($request_headers['X-Auth']) OR ! isset($request_headers['X-Auth-Hash'])) { return false; } $user = User::get_by('public_key', $request_headers['X-Auth']); if ( ! $user) { return false; } // every request must contain a valid entity if

2021-12-09 02:28:29    分类:技术分享    php   api   rest   authentication

Restful:如何访问 Service 类中的 Httpsession?(Restful : How to get access to Httpsession inside the Service class?)

问题 我正在使用 Jersey 宁静的网络服务。 这是我下面的代码 @Path(/test) public class testService { @POST public String getData(Postdata postdata) { } } 我的问题是,是否可以在这个类中访问 httpSession 对象? 回答1 尝试: @POST public String getData(Postdata postdata, @Context HttpServletRequest request) { HttpSession session = request.getSession(); } 回答2 如果您的服务不是单例,您可以使用: @Path("/test") public class TestResource { @Context private HttpServletRequest request; @POST public String getData(Postdata postdata) { HttpSession session = request.getSession(); } }

2021-12-08 22:05:20    分类:技术分享    java   rest   jersey

Oauth 2.0 是否需要消费者密钥/消费者秘密(Does Oauth 2.0 need consumer key/consumer secret)

问题 所以很明显,在使用 OAuth 1.0 时,您需要从 API 提供者那里获取消费者密钥和消费者秘密…… 但是当我尝试使用 OAuth 2.0 API 时,例如 Facebook、Google Oauth 2.0 等,我从不需要获取消费者密钥/消费者秘密(我为 Facebook 获取了 App ID 和 App 秘密,但这些与消费者密钥/消费者秘密不同我对么?) 所以我的问题是……在使用 Oauth 2.0 时,您是否不需要像 Oauth 1.0 那样拥有消费者密钥/消费者秘密? Oauth 2.0 也不需要签名方法(HMAC-SHA1 等),对吗? HMAC-SHA1 仅与 Oauth 1.0 相关,对吗? 回答1 OAuth 2 提供商通常会为您的客户端/应用程序提供一个标识符和一些机密/密码,OAuth 草案将这些称为客户端标识符和客户端机密。 这些用于检查呼叫是否真的由您的应用程序发出。 然而,OAuth 涵盖了不同的授权授予流程,这些流程或多或少是安全的,并不都需要某种秘密。 Google 称它们为client ID和client secret ,Facebook 称它们为App ID和App Secret ,但它们都是一样的。 是的,所有加密步骤都在 OAuth 2 中移到了服务器端。 回答2 您所指的授权授予流程在 OAuth 2 规范中称为客户端凭据授予流程。

2021-12-08 21:53:49    分类:技术分享    api   rest   authentication   oauth   oauth-2.0

AFNetworking POST 到 REST 网络服务(AFNetworking POST to REST webservice)

问题 简短的背景故事,我们以前的开发人员使用 ASIHTTPRequest 发出 POST 请求并从我们的 Web 服务中检索数据。 由于未知原因,我们应用程序的这一部分停止工作。 似乎有足够的时间来证明未来并使用 AFNetworking。 REST web 服务在 CakePHP 框架上运行。 简而言之,我没有收到使用 AFNetworking 的请求响应字符串。 我知道网络服务有效,因为我能够使用 curl 成功发布数据并接收正确的响应: curl -d "data[Model][field0]=field0value&data[Model][field1]=field1value" https://example.com /api/class/function.plist 根据以前的开发人员的指示,我想出了以下内容。 #import "AFHTTPRequestOperation.h" … - (IBAction)loginButtonPressed { NSURL *url = [NSURL URLWithString:@"https://example.com/api/class/function.plist"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

2021-12-08 20:03:57    分类:技术分享    iphone   cakephp   rest   post   afnetworking

.NET 相当于 curl 将文件上传到 REST API?(.NET equivalent of curl to upload a file to REST API?)

问题 我需要将 ics 文件上传到 REST API。 给出的唯一示例是 curl 命令。 用于使用 curl 上传文件的命令如下所示: curl --user {username}:{password} --upload-file /tmp/myappointments.ics http://localhost:7070/home/john.doe/calendar?fmt=ics 我如何在 C# 中使用 HttpWebRequest 来做到这一点? 另请注意,我可能只将 ics 作为字符串(而不是实际文件)。 回答1 我设法得到了一个可行的解决方案。 怪癖是将请求的方法设置为 PUT 而不是 POST。 这是我使用的代码示例: var strICS = "text file content"; byte[] data = Encoding.UTF8.GetBytes (strICS); HttpWebRequest request = (HttpWebRequest)WebRequest.Create ("http://someurl.com"); request.PreAuthenticate = true; request.Credentials = new NetworkCredential ("username", "password");; request

2021-12-08 19:12:36    分类:技术分享    c#   .net   rest   curl   httpwebrequest

Codeigniter + HMVC + REST(Codeigniter + HMVC + REST)

问题 我正在开发基于 Codeigniter + HMVC 的应用程序,并且正在尝试添加一个新模块。 我使用 Phil Sturgeon 的REST_Controller 2.6.0和Format库来创建 REST API 作为模块。 当我尝试获取例如 http://api.example.com/user/id/1/ 或 http://api.example.com/user/id/1/format/json 时,我收到以下错误: A PHP Error was encountered Severity: Notice Message: Undefined property: Api::$format Filename: libraries/REST_Controller.php Line Number: 380 在我的routes.php我有这个: $route['user/id/(:num)/format/(:any)'] = "api/user/$1/format/$2"; $route['user/id/(:num)'] = "api/user/$1"; 应用程序的目录结构是: application --modules ----api ------config ------controller Finlay,我使用默认配置,我没有改变任何东西。 格式库在autoload

2021-12-08 18:58:33    分类:技术分享    php   api   codeigniter   rest   hmvc

HttpClient - 处理聚合异常(HttpClient - dealing with aggregate exceptions)

问题 嗨,我正在使用与此类似的 HttpClient: public static Task<string> AsyncStringRequest(string url, string contentType) { try { var client = new HttpClient(); client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue(contentType)); return client.GetStringAsync(url).ContinueWith(task => { return task.Result; }); } catch (AggregateException ex) { throw ex; } catch (WebException ex) { throw ex; } catch (Exception ex) { throw ex; } } 但是我在处理异常时遇到了困难。 我添加了额外的 catch 块只是为了尝试和单步抛出,但没有任何断点被任何 catch 块捕获。 我意识到使用 Task 异常可能发生在与调用者不同的线程上,因此异常被包装在聚合容器中,但我不确定处理这些异常的最佳方法是什么。 例如,我向

2021-12-08 18:22:44    分类:技术分享    c#   rest   exception-handling   httpclient   aggregateexception

REST 响应 - 我应该将新资源的 URL 放在标题、正文或两者中吗?(REST response - should I put the URL of the new resource in the header, body, or both?)

问题 我通过将新资源的内容放在响应正文中并将新资源的 URL 放在 Location HTTP 响应标头中来组合一个响应 POST 请求的 API。 样品要求: POST /api/v1/widgets HTTP/1.1 Content-type: application/json; Accept: application/json; { "name": "hugo@example.com", "price": "10", } 示例响应: HTTP 201 Created Location: http://example.com/api/v1/widgets/123456 { 'widget': { 'id': "123456", 'created': "2012-06-22T12:43:37+0100", 'name': "hugo@example.com", 'price': "10", }, } 有人提出了 URL 也应该在响应正文中的问题。 有这方面的最佳实践吗? 回答1 没有将新创建的资源的位置(URL)放在正文中是有原因的:URL 是服务消费者和服务之间消息交互所需的元数据,它不是“业务数据”。 有一种称为“消息传递元数据”的 SOA 设计模式,它建议 URL、安全凭证、相关标识符、事务 ID 和其他消息传递和组合上下文数据应放在标题中,而不是放在消息正文中。 事实上

2021-12-08 18:09:24    分类:技术分享    http   rest

REST 数字或字符串资源标识符?(REST numeric or string resource identifiers?)

问题 我正在做一些研究来帮助我开发 REST API,这是我在任何地方都没有深入讨论过的一个主题。 如果我在系统中有一个用户,使用数字标识符来识别用户是否更好 /用户/1 还是使用字符串标识符? /用户/RSmith 我可以看到每种方法的假设潜在优缺点,字符串标识符更易读,不易发现(不能增加以找到有效用户),并且不需要在数据库中存储另一个数字 id(我不会想通过 API 公开数据库 ID)。 数字标识符没有内在含义,因此可以保证是不可变的,而对于字符串 id,用户可能想要重命名资源,从而更改资源 URI。 这里是否有 REST 最佳实践,或者最佳方法是否因系统而异? 如果是后者,每种方法是否还有其他优缺点? 回答1 如您所知,严格来说,两种方法之间没有优势。 是的,字符串标识可能更容易让人们记住,但除此之外,REST 不会强制执行“漂亮”的 URL(或 ID),因为大多数时候 URL 是由程序按照超链接访问的。 因此,人类友好的 URL 应该只用于引导人类可能记住的资源。 此外,ID 猜测不应该是一个问题,因为: 您必须根据任何身份验证方法限制对 URL 的访问,或者: 您必须使用非“公开”的随机/不可猜测的 URL。 那么使用哪一种呢? 大多数情况下,这无关紧要,因为不能直接访问 ID。 如果您出于某种原因必须确保人们记住他们的 URL,请尝试使它们人性化

2021-12-08 17:29:17    分类:技术分享    rest   identifier   resource-id