调用Twitter API上传媒体返回Code 32认证错误,Postman正常RestSharp失败
Twitter API错误码32(认证失败)问题修复方案
错误码32代表OAuth签名校验未通过,你的代码存在三处导致签名失效、请求格式错误的问题,修复步骤如下:
问题1:手动指定了错误的Content-Type头
multipart/form-data请求必须包含boundary分隔符参数,RestSharp在检测到请求包含文件时会自动生成带正确boundary的Content-Type头,你手动添加的头缺少boundary参数,不仅会导致请求格式错误,还会被算入OAuth签名基底,导致签名不匹配。
- 修复:直接删除
request.AddHeader("Content-Type", "multipart/form-data");这行代码即可。
问题2:查询参数直接拼接在请求路径中
RestSharp的OAuth1Authenticator默认只会把通过AddQueryParameter方法添加的参数计入签名计算,你直接把media_category=tweet_image拼在路径里,签名计算时会漏掉这个参数,导致Twitter侧校验签名失败。
- 修复:拆分路径和查询参数:
// 原来的写法 // var path = $"media/upload.json?media_category=tweet_image"; // 改为 var path = "media/upload.json"; var request = new RestRequest(path, Method.POST); // 单独添加查询参数 request.AddQueryParameter("media_category", "tweet_image");
问题3:AddFileBytes参数传位错误
你调用的AddFileBytes重载参数顺序为(参数名, 字节数组, 文件名, 内容类型),你把内容类型填到了文件名的位置,会导致上传的媒体文件content-type错误,也可能触发签名校验失败。
- 修复:调整参数顺序,补全正确的文件名和内容类型:
// 原来的写法 // request.AddFileBytes("media", imageArray, "image/png"); // 改为,第三个参数为自定义文件名,第四个为内容类型 request.AddFileBytes("media", imageArray, "upload.png", "image/png");
额外校验项
确认_restClientUpload的BaseAddress设置为https://upload.twitter.com/1.1/,Twitter媒体上传接口的域名和普通接口不同,不能填api.twitter.com。
修复后完整代码
public async Task UploadImageAsync() { var imagePath = @"C:\myImagePath.png"; byte[] imageArray = System.IO.File.ReadAllBytes(imagePath); _restClientUpload.Authenticator = OAuth1Authenticator.ForProtectedResource(customer_key, customer_key_secret, access_token, access_token_secret); // 拆分路径和查询参数 var path = "media/upload.json"; var request = new RestRequest(path, Method.POST); request.AddQueryParameter("media_category", "tweet_image"); // 调整AddFileBytes参数顺序 request.AddFileBytes("media", imageArray, "upload.png", "image/png"); var response = await _restClientUpload.ExecuteAsync(request); if (!response.IsSuccessful) { Console.WriteLine(response.StatusDescription); } }
内容的提问来源于stack exchange,提问作者Jean-Pierre-Karim
相关产品推荐
相关产品推荐

