如何使用Jsoup发送含数组数据的POST请求获取PHP服务器JSON
解决Jsoup发送带数组的POST请求问题
看起来你遇到的核心问题是Jsoup默认的表单参数传递方式没有正确匹配PHP后端对数组参数的解析逻辑。Postman会自动处理数组参数的格式,但Jsoup需要你显式构造符合PHP要求的请求参数。
问题根源
你的PHP后端通过$_POST['cur_key']接收数组,并使用implode拼接SQL条件。这意味着后端期望cur_key是一个数组类型的POST参数,而不是单个字符串。Postman在发送数组参数时,会自动生成类似cur_key[]=1&cur_key[]=2或cur_key=1&cur_key=2的请求体,PHP会自动将其解析为数组;但如果用Jsoup直接传单个字符串(比如data("cur_key", "1,2,3")),后端拿到的是字符串,implode就会报错,导致请求失败。
解决方案:用Jsoup构造正确的数组参数
有两种可靠的方式实现:
方式1:直接传递数组给Jsoup的data方法
Jsoup的data(String key, String... values)方法支持传入多个值,它会自动生成多个同key的参数,PHP会将其解析为数组:
import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.Connection.Method; public class JsoupPostArray { public static void main(String[] args) throws Exception { // 要发送的数组数据 String[] curKeys = {"1", "2", "3"}; // 发送POST请求 Document doc = Jsoup.connect("你的后端接口URL") .data("cur_key", curKeys) // 直接传入数组,Jsoup会生成多个cur_key参数 .method(Method.POST) .ignoreContentType(true) // 关键:忽略HTML类型检查,因为后端返回JSON .execute() .parse(); // 获取JSON响应内容 String jsonResponse = doc.text(); System.out.println(jsonResponse); } }
方式2:手动添加带[]后缀的参数名
PHP也支持识别带[]后缀的参数为数组,你可以逐个添加参数:
Document doc = Jsoup.connect("你的后端接口URL") .data("cur_key[]", "1") .data("cur_key[]", "2") .data("cur_key[]", "3") .method(Method.POST) .ignoreContentType(true) .execute() .parse(); String jsonResponse = doc.text(); System.out.println(jsonResponse);
关键注意事项
- 必须添加
ignoreContentType(true):Jsoup默认期望响应是HTML,后端返回JSON时如果不忽略类型,会解析失败,无法获取正确的响应内容。 - 修复你的PHP代码的SQL注入风险:你当前的代码直接将用户输入拼进SQL,存在严重的安全漏洞。建议改用预处理语句:
$link = mysqli_connect("localhost", "root", "pwd", "blockchain"); if($link === false){ die("ERROR: Could not connect. " . mysqli_connect_error()); } $cur_key = $_POST['cur_key']; // 确保cur_key是数组 if(!is_array($cur_key)){ die("ERROR: Invalid parameter type."); } // 构造预处理语句,防止SQL注入 $placeholders = implode(',', array_fill(0, count($cur_key), '?')); $sql = "SELECT * FROM crypto where id IN($placeholders)"; $stmt = mysqli_prepare($link, $sql); // 绑定参数(假设id是字符串类型,若为数字则用'i') $types = str_repeat('s', count($cur_key)); mysqli_stmt_bind_param($stmt, $types, ...$cur_key); // 执行并获取结果 mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); // 处理结果并返回JSON $encode = []; while($row = mysqli_fetch_assoc($result)){ $encode[] = $row; } echo json_encode($encode); // 关闭连接 mysqli_stmt_close($stmt); mysqli_close($link);
内容的提问来源于stack exchange,提问作者yunusdgn_tr
相关产品推荐
相关产品推荐

