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

PHP接口返回HTML而非JSON的问题排查与解决

问题分析与解决方案

你遇到的核心问题是:服务器返回了人机验证脚本(而非你PHP脚本输出的JSON),这是因为请求被服务器的反爬/人机验证机制拦截了。下面分步骤解决:

一、先修复PHP脚本本身的错误

你的PHP脚本存在几个小问题,先修正以确保逻辑正确:

  • 重复执行了mysqli_query,冗余代码会导致资源浪费
  • 错误使用了变量$connection(实际是$conn)
  • 使用nl2br输出JSON会破坏格式,需设置正确的响应头

修正后的PHP代码:

<?php
include('connect.php');

$sql = "select * from parent";
$result = mysqli_query($conn, $sql) or die("Error in Selecting: " . mysqli_error($conn));

$emparray = array();
while($row = mysqli_fetch_assoc($result)) {
    $emparray[] = $row;
}

// 设置JSON响应头,告诉客户端返回的是JSON格式
header('Content-Type: application/json');
echo json_encode($emparray);
?>

二、解决人机验证拦截问题

服务器返回的AES解密脚本是典型的反爬验证(比如Cloudflare JS挑战、主机商防爬机制),需要让请求模拟正常浏览器行为:

1. 给C#请求添加浏览器特征头

修改C#客户端代码,添加浏览器UA、Accept等请求头,让服务器认为是正常访问:

var client = new HttpClient();
// 添加浏览器标识、接受类型等头信息
client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36");
client.DefaultRequestHeaders.Accept.ParseAdd("application/json, text/javascript, */*; q=0.01");

var response = await client.GetAsync("你的PHP接口URL");
var contentString = await response.Content.ReadAsStringAsync();

// 检查是否仍被拦截返回HTML
if (contentString.StartsWith("<html>")) {
    // 手动获取浏览器访问后的有效Cookie(步骤见下方)
    client.DefaultRequestHeaders.Add("Cookie", "__test=xxx; 其他Cookie键值对");
    // 重新发起请求
    response = await client.GetAsync("你的PHP接口URL");
    contentString = await response.Content.ReadAsStringAsync();
}

var content = JsonSerializer.Deserialize<Parent[]>(contentString);

foreach (var item in content) {
    Console.WriteLine("Parent ID: {0}", item.parent_id);
    Console.WriteLine("Name: {0}", item.name);
    Console.WriteLine("Mobile: {0}", item.mobile);
    Console.WriteLine("CPR: {0}", item.cpr);
    Console.WriteLine("Email: {0}", item.email);
}

2. 手动获取有效Cookie

如果添加头后仍被拦截,需要从浏览器获取验证通过后的Cookie:

  • 用Chrome/Firefox打开你的PHP接口URL
  • 按F12打开开发者工具,切换到「Application」标签
  • 在左侧「Cookies」下找到__test等验证相关的Cookie,复制其键值对
  • 将复制的Cookie添加到C#请求的Cookie头中

3. 调整服务器防护设置

如果是你自己的服务器:

  • 检查是否开启Cloudflare的「JS挑战」,可暂时关闭或添加请求IP到白名单
  • 查看主机商的防爬插件(如ModSecurity),调整规则避免拦截合法请求
  • 控制请求频率,避免短时间内大量触发反爬机制

内容的提问来源于stack exchange,提问作者nooona alnon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 21:27:16