使用Ruby的Net::HTTP调用GPTZero API时POST请求返回400错误排查
问题排查与解决方案
针对你遇到的Text must be a string错误,核心原因是请求体中document参数的格式不符合API要求,以下是具体排查点和修正方法:
1. 确认document参数的类型
GPTZero试用API要求document必须是单个字符串,不能是数组、嵌套对象或其他类型。如果你的代码里把document设成了数组(比如document: ["你的文本"]),就会触发这个错误。正确写法应为:
document: "需要检测的完整文本内容"
2. 确保请求体正确序列化并设置请求头
Ruby发送POST请求时,必须将请求体序列化为JSON字符串,同时设置Content-Type: application/json请求头,否则API无法正确解析参数。
错误示例(易踩坑)
require 'net/http' require 'uri' uri = URI('https://api.gptzero.me/v2/predict/text') http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true request = Net::HTTP::Post.new(uri) # 错误:document是数组,且未将哈希转为JSON字符串 request.body = { document: ["测试文本"], version: "2024-01-01" } response = http.request(request) puts response.body
修正后的代码
require 'net/http' require 'uri' require 'json' uri = URI('https://api.gptzero.me/v2/predict/text') http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true request = Net::HTTP::Post.new(uri) request['Content-Type'] = 'application/json' # 正确:document为字符串,且将哈希序列化为JSON request.body = { document: "需要检测的完整文本内容", version: "2024-01-01" }.to_json response = http.request(request) puts response.body
3. 检查参数名与内容有效性
- 确认参数名是
document,而非text、documents等拼写错误的名称 - 确保
document的值是非空字符串,不能为nil、数字或空文本
内容的提问来源于stack exchange,提问作者user3574603
相关产品推荐
相关产品推荐

