You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift 4中POST URLRequest调用Imgur上传图片失败(400错误)

解决Swift调用Imgur API上传图片返回400的问题

我之前也踩过这个一模一样的坑!Postman里测试好好的,到Swift里就返回400,折腾了半天才发现核心问题——Imgur的图片上传接口根本不接受JSON格式的请求体,而是要求用multipart/form-data格式,这大概率就是你失败的原因。

先理清核心差异:Postman vs Swift的请求格式

你在Postman里成功的请求,应该是选了form-data类型,把图片作为文件字段传递的;但你Swift里用JSON编码请求体,完全不符合Imgur API的要求,自然会返回400错误。

正确的Swift实现步骤

下面是我验证过的可行代码,你可以对照调整:

1. 配置请求头部

必须带上Authorization头部,格式是Client-ID 你的客户端ID,注意中间的空格不能少:

let uploadUrl = URL(string: "https://api.imgur.com/3/image")!
var request = URLRequest(url: uploadUrl)
request.httpMethod = "POST"
// 替换成你的myid
request.setValue("Client-ID your_client_id_here", forHTTPHeaderField: "Authorization")

2. 构建multipart/form-data请求体

Imgur要求图片字段名为image,我们需要把图片数据包装成multipart表单:

// 假设你已经获取了图片的Data(比如从UIImage转换)
guard let imageData = UIImage(named: "your_image")?.jpegData(compressionQuality: 0.8) else {
    print("获取图片数据失败")
    return
}

// 生成随机boundary,用于分隔表单字段
let boundary = UUID().uuidString
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")

var formData = Data()
// 添加image字段的头部信息
formData.append("--\(boundary)\r\n".data(using: .utf8)!)
formData.append("Content-Disposition: form-data; name=\"image\"; filename=\"uploaded_image.jpg\"\r\n".data(using: .utf8)!)
formData.append("Content-Type: image/jpeg\r\n\r\n".data(using: .utf8)!)
// 添加图片数据
formData.append(imageData)
// 结束当前字段
formData.append("\r\n".data(using: .utf8)!)
// 结束整个表单
formData.append("--\(boundary)--\r\n".data(using: .utf8)!)

request.httpBody = formData

3. 发起请求并处理响应

用URLSession发送请求,同时打印响应信息方便排查:

let task = URLSession.shared.dataTask(with: request) { data, response, error in
    if let error = error {
        print("请求出错: \(error.localizedDescription)")
        return
    }
    
    guard let httpResponse = response as? HTTPURLResponse else {
        print("无效的响应格式")
        return
    }
    
    print("响应状态码: \(httpResponse.statusCode)")
    
    if let data = data, let responseJson = String(data: data, encoding: .utf8) {
        print("响应内容: \(responseJson)")
    }
}
task.resume()

额外需要检查的细节

  • 确认客户端ID完全正确:和Postman里使用的一模一样,注意大小写和特殊字符
  • 图片数据有效性:比如UIImage转Data时是否成功,图片格式是否是Imgur支持的(JPG、PNG等)
  • 核对请求头部:Content-Type必须包含正确的boundary,和你生成的UUID一致

如果还是有问题,可以把Swift里的请求头部和body(注意隐藏客户端ID)打印出来,和Postman里的请求对比,很快就能找到差异点。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:13:56