You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用AutoHotkey向Rest API发送POST字符串及认证技术问询

AutoHotkey POST请求到REST API的代码修正与认证指南

先帮你梳理下这段代码的问题,再聊聊REST API认证的常见实现方式,这样你就能顺利完成请求啦:

一、代码正确性修正

你提供的代码有两个关键错误,导致没法正确发送JSON请求:

  • JSON构造不对:AHK v1里不能直接用({"name": "Any Name"})这种写法来定义JSON,得老老实实写成标准的JSON字符串(注意AHK里双引号要转义,用两个双引号),或者用专门的JSON库来序列化对象。
  • 变量赋值错误Body = json_str这行是把字符串"json_str"传给了请求体,而不是你定义的json_str变量的内容,得改成Body := json_str才能引用变量值。

修正后的可用代码:

URL := "http://localhost:8000/createPlayer"
HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
HttpObj.Open("POST", URL, 0) ; 0代表同步请求,请求完成后才会继续执行代码
HttpObj.SetRequestHeader("Content-Type", "application/json")
; 直接构造标准JSON字符串,注意双引号转义
json_str := "{""name"": ""Any Name""}"
Body := json_str ; 正确引用变量内容
HttpObj.Send(Body)
MsgBox, %Body%
Result := HttpObj.ResponseText
Status := HttpObj.Status
msgbox % "status: " status "`n`nresult: " result

如果需要动态生成JSON(比如从变量获取用户名),可以这样拼接:

playerName := "John Doe"
json_str := "{""name"": """ playerName """}"

要是处理复杂的JSON结构,推荐用AHK的JSON.ahk库来序列化对象,避免手动拼接时出错。

二、REST API认证的常见实现方式

接下来说说几种主流的REST API认证方式,以及怎么在AutoHotkey里实现:

1. Basic 认证

这种方式是把用户名和密码拼接成用户名:密码的格式,再用Base64编码,最后放在Authorization请求头里:

username := "your_username"
password := "your_password"
authStr := username ":" password
encodedAuth := Base64Encode(authStr) ; 需要自己实现或引入Base64编码函数
HttpObj.SetRequestHeader("Authorization", "Basic " encodedAuth)

注意:AHK v1没有内置Base64编码功能,你可以在AHK社区找到现成的实现,或者自己写一个简单的版本。

2. Bearer Token(令牌认证)

这是目前最常用的认证方式,比如JWT令牌。只需要把令牌放在Authorization头里,前缀加上Bearer即可:

token := "your_jwt_token_here"
HttpObj.SetRequestHeader("Authorization", "Bearer " token)

3. API Key认证

很多API会要求在请求头里添加专属的API Key,通常用X-API-Key作为头字段:

apiKey := "your_api_key_here"
HttpObj.SetRequestHeader("X-API-Key", apiKey)

也有部分API会把API Key放在URL参数里,比如http://localhost:8000/createPlayer?api_key=xxx,这种直接修改请求URL就行。

4. 先登录获取令牌再请求

如果API需要先通过表单登录获取令牌,再用令牌访问接口,可以这样做:

; 第一步:请求登录接口获取令牌
tokenURL := "http://localhost:8000/login"
HttpObj.Open("POST", tokenURL, 0)
HttpObj.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
loginBody := "username=your_user&password=your_pass"
HttpObj.Send(loginBody)
tokenResult := HttpObj.ResponseText
; 这里可以用JSON库解析返回的内容,提取出令牌
; 第二步:用令牌请求目标接口
HttpObj.Open("POST", URL, 0)
HttpObj.SetRequestHeader("Content-Type", "application/json")
HttpObj.SetRequestHeader("Authorization", "Bearer " extractedToken)
HttpObj.Send(json_str)

内容的提问来源于stack exchange,提问作者Folllast

火山引擎 最新活动