API 文档

使用 API 密钥以编程方式上传文件。支持 APK、IPA 类型,具有自动元数据提取功能。

概述

AppDrop 提供了一个简单且安全的文件上传 API。上传过程包括三个步骤:

1

获取预签名 URL

从我们的 API 请求安全的上传 URL

2

上传到 S3

直接将文件上传到 AWS S3

3

完成上传

完成并处理上传

开始使用 - 创建 API 密钥

在使用 API 之前,您需要创建一个 API 密钥。按照以下步骤开始:

步骤 1:创建用户账户

首先,您需要在 AppDrop 上创建一个用户账户。

  • 前往注册页面 前往注册页面
  • 填写您的电子邮件和密码
  • 验证您的电子邮件地址
  • 完成您的个人资料设置

步骤 2:访问仪表板

创建账户后,访问仪表板以管理您的 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