使用RestClient调用Twitter媒体上传API返回400错误,求排查
问题描述
按照rest-client gem文档指引,在Rails控制台通过RestClient.post请求上传图片至Twitter的https://upload.twitter.com/1.1/media/upload.json接口:
- 指定
media_category=tweet_image - 参数为
:myfile => File.new("/Users/main/Desktop/ss2022-11-03_11.39.11.png", 'rb')
确认文件路径正确,但请求始终返回400 Bad Request。同时不清楚File.new第二个参数的含义。
参考Twitter 1.1 API文档提供的twurl测试命令:
twurl -X POST -H upload.twitter.com "/1.1/media/upload.json?media_category=TWEET_IMAGE&additional_owners=3805104374" -f adsapi-heirarchy.png -F media
无论是否包含可选参数additional_owners,均返回相同错误。
关键问题分析
1. File.new第二个参数的含义
'rb'是文件打开模式,代表只读二进制模式,这部分是正确的——上传图片类二进制文件必须用该模式读取,避免编码问题。
2. 请求缺失的核心要素
参数名不匹配
Twitter媒体上传接口要求上传文件的参数名必须是media,你当前用的:myfile不符合要求。twurl命令中-F media正是指定了正确的参数名,rest-client请求需同步改为:media。
OAuth认证缺失
Twitter API所有请求必须通过OAuth 1.0a认证。twurl会自动读取本地配置的认证信息,但RestClient请求需要手动携带正确的OAuth密钥(consumer key、consumer secret、access token、access token secret),未携带或认证信息错误会直接返回400。
参数大小写错误
Twitter要求media_category的值为全大写的TWEET_IMAGE,你当前传的tweet_image是小写,会触发接口验证失败。
请求格式问题
用RestClient上传文件时,不要手动设置Content-Type,需依赖RestClient自动生成multipart/form-data类型的请求头,否则会导致数据解析失败。
修正后的RestClient请求示例
RestClient.post( 'https://upload.twitter.com/1.1/media/upload.json', { media: File.new("/Users/main/Desktop/ss2022-11-03_11.39.11.png", 'rb'), media_category: 'TWEET_IMAGE' }, { # 替换为你的OAuth认证信息,或使用rest-client的OAuth扩展自动处理签名 Authorization: 'OAuth oauth_consumer_key="你的Consumer Key", oauth_nonce="随机字符串", oauth_signature="生成的签名", oauth_signature_method="HMAC-SHA1", oauth_timestamp="当前时间戳", oauth_token="你的Access Token", oauth_version="1.0"' } )
内容的提问来源于stack exchange,提问作者Jerome

