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

如何使用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);

关键注意事项

  1. 必须添加ignoreContentType(true):Jsoup默认期望响应是HTML,后端返回JSON时如果不忽略类型,会解析失败,无法获取正确的响应内容。
  2. 修复你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:08:01