API 文档
使用 API 密钥以编程方式上传文件。支持 APK、IPA 类型,具有自动元数据提取功能。
快速导航
概述
AppDrop 提供了一个简单且安全的文件上传 API。上传过程包括三个步骤:
1
获取预签名 URL
从我们的 API 请求安全的上传 URL
2
上传到 S3
直接将文件上传到 AWS S3
3
完成上传
完成并处理上传
开始使用 - 创建 API 密钥
在使用 API 之前,您需要创建一个 API 密钥。按照以下步骤开始:
步骤 3:创建项目(必需)
首先创建项目 - API 密钥需要与项目关联。
- • 在仪表板中,点击"创建项目"按钮
- • 输入项目名称和描述
- • 为您的项目选择颜色
- • 点击"创建项目"保存
- • 注意: 注意:在创建 API 密钥之前,您必须至少有一个项目
步骤 4:创建 API 密钥
现在创建您的 API 密钥以开始使用 API。
- • 在仪表板中,点击"安全"选项卡
- • 点击"开发者设置"按钮
- • 点击"创建新密钥"按钮
- • 为您的 API 密钥输入名称
- • 选择一个项目(必需)
- • 点击"创建密钥"生成
- • 重要: 重要:立即复制您的客户端 ID 和客户端密钥
步骤 5:使用您的 API 密钥
现在您已准备好使用您的凭据使用 API。
- • 在 X-Client-ID 标头中使用您的客户端 ID
X-Client-ID
header - • 在 Authorization: Bearer 标头中使用您的客户端密钥
Authorization: Bearer
header - • 按照下面的 API 文档上传文件
⚠️ 重要安全注意事项
- • 保持您的客户端密钥安全,切勿在客户端代码中暴露它
- • API 密钥与您的用户账户和项目绑定
- • 如果需要,您可以重新生成 API 密钥
- • 在开发者设置中监控您的 API 使用情况
身份验证
所有 API 请求都需要使用 API 密钥进行身份验证。您可以在开发者设置中创建 API 密钥。
必需标头
X-Client-ID: your_client_id
Authorization: Bearer your_client_secret
Content-Type: application/json
上传流程
步骤 1:获取预签名 URL
请求预签名 URL 以直接上传到 S3。此 URL 有效期为 15 分钟。
请求:
POST /api/upload/api-key/presign { "fileName": "app.apk", "fileSize": 1048576, "fileType": "application/vnd.android.package-archive" }
步骤 2:上传到 S3
使用预签名 URL 将文件直接上传到 AWS S3。
请求:
PUT {presigned_url} Content-Type: application/octet-stream Body: file_binary_data
步骤 3:完成上传
通知 API 上传已完成并处理文件。
请求:
POST /api/upload/api-key/complete { "key": "s3_key_from_step_1", "fileName": "app.apk", "fileType": "application/vnd.android.package-archive", "fileSize": 1048576 }
API 端点
POST
/api/upload/api-key/presign
获取文件上传的预签名 URL
响应:
{ "fileId": "507f1f77bcf86cd799439011", "key": "uploads/user123/app.apk", "uploadUrl": "https://s3.amazonaws.com/...", "expireAt": "2024-01-01T12:00:00Z" }
POST
/api/upload/api-key/complete
完成上传过程
响应:
{ "message": "上传成功完成", "fileId": "507f1f77bcf86cd799439011", "userKey": "abc123def456", "downloadUrl": "https://...", "shareUrl": "https://appdrop.com/share/abc123def456", "metadata": { "appName": "MyApp", "bundleId": "com.example.myapp", "version": "1.0.0" } }
代码示例
Go 示例
package main
import (
"bytes"
"encoding/json"
"net/http"
"os"
)
func main() {
clientID := "your_client_id"
clientSecret := "your_client_secret"
apiBaseURL := "https://api.app-dr.com"
filePath := "test.ipa"
file, err := os.Open(filePath)
if err != nil {
return
}
defer file.Close()
fileInfo, _ := file.Stat()
fileSize := fileInfo.Size()
// Step 1: Get presigned URL
presignData := map[string]interface{}{
"fileName": fileInfo.Name(),
"fileSize": fileSize,
"fileType": "application/octet-stream",
}
jsonData, _ := json.Marshal(presignData)
req, _ := http.NewRequest("POST", apiBaseURL+"/api/upload/api-key/presign", bytes.NewBuffer(jsonData))
req.Header.Set("X-Client-ID", clientID)
req.Header.Set("Authorization", "Bearer "+clientSecret)
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return
}
defer resp.Body.Close()
if resp.StatusCode != 200 {
return
}
var presignResult map[string]interface{}
json.NewDecoder(resp.Body).Decode(&presignResult)
uploadURL, ok1 := presignResult["uploadUrl"].(string)
s3Key, ok2 := presignResult["key"].(string)
if !ok1 || !ok2 {
return
}
// Step 2: Upload file to S3
file.Seek(0, 0)
uploadReq, _ := http.NewRequest("PUT", uploadURL, file)
uploadReq.ContentLength = fileSize
uploadResp, err := client.Do(uploadReq)
if err != nil {
return
}
defer uploadResp.Body.Close()
if uploadResp.StatusCode != 200 {
return
}
// Step 3: Complete upload
completeData := map[string]interface{}{
"key": s3Key,
"fileName": fileInfo.Name(),
"fileType": "application/octet-stream",
"fileSize": fileSize,
}
completeJson, _ := json.Marshal(completeData)
completeReq, _ := http.NewRequest("POST", apiBaseURL+"/api/upload/api-key/complete", bytes.NewBuffer(completeJson))
completeReq.Header.Set("X-Client-ID", clientID)
completeReq.Header.Set("Authorization", "Bearer "+clientSecret)
completeReq.Header.Set("Content-Type", "application/json")
completeResp, err := client.Do(completeReq)
if err != nil {
return
}
defer completeResp.Body.Close()
if completeResp.StatusCode != 200 {
return
}
var completeResult map[string]interface{}
json.NewDecoder(completeResp.Body).Decode(&completeResult)
}
速率限制
API 请求受到速率限制,以确保公平使用和系统稳定性。
速率限制
- • 每个 API 密钥每分钟 100 个请求
- • 响应中包含速率限制标头
- • 超出限制时返回 429 状态码
速率限制标头
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1640995200