标签: api

如何为HttpClient请求设置Content-Type标头?

我正在尝试根据我调用的API 设置对象的Content-Type标头HttpClient.

我尝试过Content-Type如下设置:

using (var httpClient = new HttpClient())
{
    httpClient.BaseAddress = new Uri("http://example.com/");
    httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
    httpClient.DefaultRequestHeaders.Add("Content-Type", "application/json");
    // ...
}
Run Code Online (Sandbox Code Playgroud)

它允许我添加Accept标题但是当我尝试添加Content-Type它时抛出以下异常:

未使用的标题名称.确保请求标头与对象HttpRequestMessage一起使用 ,响应标头HttpResponseMessage和带有HttpContent对象的内容标头.

如何Content-TypeHttpClient请求中设置标头?

c# asp.net api rest http

677
推荐指数
11
解决办法
70万
查看次数

JWT(JSON Web Token)自动延长到期时间

我想对我们的新REST API实现基于JWT的身份验证.但是由于在令牌中设置了到期,是否可以自动延长它?如果他们在那段时间内积极使用该应用程序,我不希望用户在每X分钟后需要登录.这将是一个巨大的用户体验失败.

但是延长过期会创建一个新令牌(旧令牌在到期之前仍然有效).每次请求后生成一个新令牌听起来很愚蠢.当多个令牌同时有效时,听起来像是一个安全问题.当然,我可以使用黑名单使旧的旧的无效,但我需要存储令牌.JWT的一个好处就是没有存储空间.

我发现Auth0是如何解决它的.它们不仅使用JWT令牌,还使用刷新令牌:https: //docs.auth0.com/refresh-token

但同样,要实现这一点(没有Auth0),我需要存储刷新令牌并保持其过期.那么真正的好处是什么?为什么不只有一个令牌(不是JWT)并在服务器上保持过期?

还有其他选择吗?使用JWT不适合这种情况吗?

security authentication api node.js jwt

465
推荐指数
10
解决办法
17万
查看次数

什么是应用程序二进制接口(ABI)?

我从未明白ABI是什么.请不要指向维基百科的文章.如果我能理解它,我就不会在这里张贴这么长的帖子.

这是我对不同界面的看法:

电视遥控器是用户和电视之间的接口.它是一个现有实体,但本身无用(不提供任何功能).遥控器上每个按钮的所有功能都在电视机中实现.

接口:它是间"现有实体"层 functionalityconsumer的该功能.接口本身不起作用.它只是调用后面的功能.

现在取决于用户是谁,有不同类型的接口.

命令行界面(CLI)命令是现有实体,消费者是用户和功能所在.

functionality: 我的软件功能解决了我们描述这个界面的一些目的.

existing entities: 命令

consumer: 用户

图形用户界面(GUI)窗口,按钮等是现有实体,消费者再次是用户和功能所在.

functionality: 我的软件功能解决了我们描述这个界面的一些问题.

existing entities: 窗口,按钮等..

consumer: 用户

应用程序编程接口(API)函数(或更正确的)接口(在基于接口的编程中)是现有实体,这里的消费者是另一个程序而不是用户,并且该层后面的功能也是如此.

functionality: 我的软件功能解决了我们描述这个界面的一些问题.

existing entities: 函数,接口(函数数组).

consumer: 另一个程序/应用程序

应用程序二进制接口(ABI)这是我的问题开始的地方.

functionality: ???

existing entities: ???

consumer: ???

  • 我用不同的语言编写了软件并提供了不同类型的接口(CLI,GUI和API),但我不确定我是否提供过任何ABI.

维基百科说:

ABI涵盖了诸如此类的详细信息

  • 数据类型,大小和对齐方式;
  • 调用约定,它控制函数参数的传递方式并返回检索的值;
  • 系统调用号码以及应用程序应如何向操作系统进行系统调用;

其他ABI标准化细节,如

  • C++名称错误,
  • 异常传播,和
  • 在同一平台上调用编译器之间的约定,但不需要跨平台兼容性.
  • 谁需要这些细节?请不要说操作系统.我知道汇编编程.我知道链接和加载是如何工作的.我确切地知道里面发生了什么.

  • 为什么C++名称输入?我以为我们正在谈二进制.语言为什么会进来?

无论如何,我已经下载了[PDF] System V Application Binary Interface Edition 4.1(1997-03-18),看看它究竟包含了什么.好吧,大部分都没有任何意义.

  • 为什么它包含两章(第4和第5章)来描述ELF文件格式?实际上,这些是该规范中仅有的两个重要章节.其余章节是"处理器特定的".无论如何,我认为这是一个完全不同的话题.请不要说ELF文件格式规范 ABI.根据定义,它不符合接口的条件.

  • 我知道,因为我们谈论的水平很低,所以必须非常具体.但我不确定它是如何"指令集架构(ISA)"具体的?

  • 我在哪里可以找到Microsoft Windows的ABI?

所以,这些是困扰我的主要问题.

compiler-construction api binary operating-system abi

444
推荐指数
11
解决办法
10万
查看次数

连字符,下划线或camelCase作为URI中的单词分隔符?

我正在为Intranet应用程序设计基于HTTP的API.我意识到这是一个非常小的问题,在宏观方案中,但是:我应该使用连字符,下划线或camelCase来分隔URI中的单词吗?


以下是我最初的想法:

骆驼香烟盒

  • 如果服务器不区分大小写,则可能出现问题
  • 似乎在查询字符串键(相当广泛使用http://api.example.comSEARCHQUERY = ...),而不是在其他URI部分

连字符号

  • 比其他替代品更美观
  • 似乎广泛用于URI的路径部分
  • 从未在野外见过带连字符的查询字符串键
  • 可能更适合SEO(这可能是一个神话)

下划线

  • 编程语言可能更容易处理
  • 几个流行的API(Facebook,Netflix,StackExchange等)在URI的所有部分都使用下划线.

对于一切我都倾向于下划线.大多数大型玩家使用它们的事实令人信服(参见/sf/answers/42592091/).

api rest url uri restful-url

428
推荐指数
7
解决办法
14万
查看次数

什么是Linux的原生GUI API?

我希望这不是一个愚蠢的问题,但它总是我想知道的.Windows(Win32 API)和OS X(Cocoa)都有自己的API来处理窗口,事件和其他操作系统.对于Linux的等价物,我从来没有真正得到明确的答案.

我听说有人说GTK +,但是GTK +是跨平台的,它怎么可能是原生的呢?

c c++ linux api user-interface

427
推荐指数
7
解决办法
11万
查看次数

如何设计RESTful搜索/过滤?

我目前正在设计和实现PHP中的RESTful API.但是,我没有成功实施我的初始设计.

GET /users # list of users
GET /user/1 # get user with id 1
POST /user # create new user
PUT /user/1 # modify user with id 1
DELETE /user/1 # delete user with id 1
Run Code Online (Sandbox Code Playgroud)

到目前为止标准相当,对吗?

我的问题是第一个问题GET /users.我正在考虑在请求正文中发送参数来过滤列表.这是因为我希望能够在不获取超长URL的情况下指定复杂的过滤器,例如:

GET /users?parameter1=value1&parameter2=value2&parameter3=value3&parameter4=value4
Run Code Online (Sandbox Code Playgroud)

相反,我希望有类似的东西:

GET /users
# Request body:
{
    "parameter1": "value1",
    "parameter2": "value2",
    "parameter3": "value3",
    "parameter4": "value4"
}
Run Code Online (Sandbox Code Playgroud)

它更具可读性,为您提供设置复杂过滤器的绝佳机会.

无论如何,file_get_contents('php://input')没有返回请求的请求体GET.我也尝试过http_get_request_body(),但我正在使用的共享主机没有pecl_http.不确定它会有所帮助.

我发现了这个问题,并意识到GET可能不应该有一个请求体.这有点不确定,但他们建议不要这样做.

所以现在我不知道该怎么做.你如何设计RESTful搜索/过滤功能?

我想我可以使用POST,但这似乎不太RESTful.

api rest search filter

426
推荐指数
6
解决办法
31万
查看次数

谷歌财务api的替代品

我想使用Google财经API获取有关该公司的股票数据,但此API自2011/26/05起已弃用.

您使用什么作为免费API来实时获取股票数据?

api google-api google-finance quandl

416
推荐指数
5
解决办法
46万
查看次数

REST API最佳实践:如何接受参数值列表作为输入

我们正在推出一个新的REST API,我想要一些关于如何格式化输入参数的最佳实践的社区意见:

现在,我们的API非常以JSON为中心(仅返回JSON).关于我们是否想要/需要返回XML的争论是一个单独的问题.

由于我们的API输出是以JSON为中心的,我们一直在走一条路,我们的输入有点以JSON为中心,我一直在想这可能对某些人来说很方便,但总的来说很奇怪.

例如,要获得一些产品详细信息,我们可以立即提取多个产品:

http://our.api.com/Product?id=["101404","7267261"]
Run Code Online (Sandbox Code Playgroud)

我们应该简化为:

http://our.api.com/Product?id=101404,7267261
Run Code Online (Sandbox Code Playgroud)

或者有JSON输入方便吗?更多的痛苦?

我们可能希望接受这两种风格,但这种灵活性是否会导致更多的混乱和头痛(可维护性,文档等)?

更复杂的情况是我们想要提供更复杂的输入.例如,如果我们想在搜索上允许多个过滤器:

http://our.api.com/Search?term=pumas&filters={"productType":["Clothing","Bags"],"color":["Black","Red"]}
Run Code Online (Sandbox Code Playgroud)

我们不一定要将过滤器类型(例如productType和颜色)作为请求名称,如下所示:

http://our.api.com/Search?term=pumas&productType=["Clothing","Bags"]&color=["Black","Red"]
Run Code Online (Sandbox Code Playgroud)

因为我们想要将所有过滤器输入组合在一起.

最后,这真的很重要吗?可能有很多JSON实用程序,输入类型并不重要.

我知道我们的JavaScript客户端对API进行AJAX调用可能会欣赏JSON输入以使他们的生活更轻松.

api rest

385
推荐指数
5
解决办法
52万
查看次数

REST API最佳实践:在何处放置参数?

REST API至少可以通过两种方式获取参数:

  1. 作为URL路径的一部分(即/api/resource/parametervalue )
  2. 作为查询参数(即/api/resource?parameter=value )

这里的最佳做法是什么?是否有任何一般指导原则何时使用1以及何时使用2?

真实世界的例子:Twitter使用查询参数来指定间隔.(http://api.twitter.com/1/statuses/home_timeline.json?since_id=12345&max_id=54321)

将这些参数放在URL路径中会被认为是更好的设计吗?

api rest url

348
推荐指数
7
解决办法
72万
查看次数

尝试从REST API获取数据时,请求的资源上不存在"Access-Control-Allow-Origin"标头

我正在尝试从HP Alm的REST API中获取一些数据.它适用于小卷曲脚本 - 我得到了我的数据.

现在使用JavaScript,fetch和ES6(或多或少)似乎是一个更大的问题.我一直收到此错误消息:

无法加载Fetch API.对预检请求的响应未通过访问控制检查:请求的资源上不存在"Access-Control-Allow-Origin"标头.因此,不允许来源" http://127.0.0.1:3000 "访问.响应具有HTTP状态代码501.如果不透明响应满足您的需要,请将请求的模式设置为"no-cors"以获取禁用CORS的资源.

我知道这是因为我试图从我的localhost中获取该数据,解决方案应该使用CORS.现在我以为我确实这样做了,但不管怎么说它要么忽略我在标题中写的内容,要么问题是别的什么?

那么,是否存在实施问题?我做错了吗?遗憾的是我无法检查服务器日志.我真的有点卡在这里.

function performSignIn() {

  let headers = new Headers();

  headers.append('Content-Type', 'application/json');
  headers.append('Accept', 'application/json');

  headers.append('Access-Control-Allow-Origin', 'http://localhost:3000');
  headers.append('Access-Control-Allow-Credentials', 'true');

  headers.append('GET', 'POST', 'OPTIONS');

  headers.append('Authorization', 'Basic ' + base64.encode(username + ":" + password));

  fetch(sign_in, {
      //mode: 'no-cors',
      credentials: 'include',
      method: 'POST',
      headers: headers
    })
    .then(response => response.json())
    .then(json => console.log(json))
    .catch(error => console.log('Authorization failed : ' + error.message));
}
Run Code Online (Sandbox Code Playgroud)

我正在使用Chrome.我也尝试使用Chrome CORS插件,但后来我收到另一条错误消息:

当请求的凭据模式为"include"时,响应中"Access-Control-Allow-Origin"标头的值不能是通配符"*".因此,不允许来源" http://127.0.0.1:3000 "访问.XMLHttpRequest发起的请求的凭据模式由withCredentials属性控制.

javascript api cors preflight fetch-api

345
推荐指数
11
解决办法
82万
查看次数