使用file_get_contents传递User-Agent调用Discogs API仍报Bad Request错误
解决Discogs API调用返回"Bad Request"的问题
看起来你遇到的核心问题是Discogs API对User-Agent字符串的严格要求——浏览器访问时会自动带上合规的UA,符合Discogs的规则,但file_get_contents默认的UA(比如PHP/7.4.33这类)会被Discogs直接拒绝,导致400错误。另外还要确保认证参数正确传递,我来帮你梳理针对性的解决方案:
关键前提:Discogs的User-Agent要求
Discogs明确规定,所有API请求的User-Agent必须是有辨识度的自定义字符串,官方推荐格式为:
你的应用名称/版本号 (+你的应用官网地址; 你的联系邮箱)
比如:MyVinylCollectionApp/2.1 (+https://myvinylapp.com; support@myvinylapp.com)
这个UA能让Discogs识别你的应用身份,避免被当作恶意请求拦截。
方案1:修复file_get_contents的请求配置
你需要在请求上下文里手动设置合法的User-Agent,同时正确传递consumer key和secret(作为URL参数即可满足公开数据请求)。完整代码示例:
// 从环境变量获取认证信息 $consumer_key = getenv('DISCOGS_CONSUMER_KEY'); $secret_key = getenv('DISCOGS_CONSUMER_SECRET'); // 符合Discogs要求的User-Agent $user_agent = "MyDiscogsApp/1.0 (+https://myappwebsite.com; contact@myappwebsite.com)"; // 构建API请求URL(以获取某张唱片信息为例,带上认证参数) $api_url = "https://api.discogs.com/releases/12345?key={$consumer_key}&secret={$secret_key}"; // 创建请求上下文,设置User-Agent头 $context = stream_context_create([ 'http' => [ 'header' => "User-Agent: {$user_agent}\r\n", 'method' => 'GET' ] ]); // 发起请求并处理结果 $response = file_get_contents($api_url, false, $context); if ($response === false) { $error = error_get_last(); echo "请求失败: " . $error['message']; } else { $data = json_decode($response, true); print_r($data); }
方案2:改用cURL(更易调试和维护)
如果file_get_contents的上下文配置还是有问题,推荐用cURL——它对HTTP请求的控制更灵活,还能直接查看HTTP状态码,方便快速定位错误:
$consumer_key = getenv('DISCOGS_CONSUMER_KEY'); $secret_key = getenv('DISCOGS_CONSUMER_SECRET'); $user_agent = "MyDiscogsApp/1.0 (+https://myappwebsite.com; contact@myappwebsite.com)"; $api_url = "https://api.discogs.com/releases/12345?key={$consumer_key}&secret={$secret_key}"; $ch = curl_init(); // 设置请求地址 curl_setopt($ch, CURLOPT_URL, $api_url); // 要求返回响应内容而不是直接输出 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 设置合法的User-Agent curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); // 自动跟随重定向(如果有的话) curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); $response = curl_exec($ch); // 处理请求结果 if (curl_errno($ch)) { echo "cURL错误: " . curl_error($ch); } else { $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($http_code === 200) { $data = json_decode($response, true); print_r($data); } else { echo "请求失败,状态码: {$http_code},响应内容: {$response}"; } } curl_close($ch);
排查步骤(如果还是报错)
- 检查User-Agent是否合规:可以在浏览器里用开发者工具手动修改UA访问API URL,确认是否能正常返回数据。
- 验证环境变量:用
var_dump($consumer_key, $secret_key)确认是否正确读取到了认证信息。 - 查看实际请求头:用抓包工具(比如Charles、Wireshark)查看请求是否真的带上了设置的User-Agent。
- 检查HTTP状态码:如果是401状态码,说明认证参数错误;如果还是400,大概率是User-Agent不符合要求。
内容的提问来源于stack exchange,提问作者spice
相关产品推荐
相关产品推荐

