参考GPT和自己的思路:在进行 HTTP POST 请求时,根据指定的 Content-Type,需要对请求体数据进行相应的编码处理。如果使用了 application/x-www-form-urlencoded 编码方式,那么需要将数据编码成类似 key1=value1&key2=value2 的格式;如果使用 application/json 编码方式,则需要将数据编码成 JSON 字符串。
在你的代码中,请求头中设置的 Content-Type 为 application/x-www-form-urlencoded,但请求体数据却是一个 JSON 字符串。这种情况下,请求体数据需要先被编码成类似 key1=value1&key2=value2 的格式,然后再通过 IdHTTP1.Post 方法发送。
另外,在数据编码成 application/x-www-form-urlencoded 格式时,数组需要使用多个相同的键名进行编码。因此,你需要将 JSON 数据中的 category_ids 字段转换成类似 category_ids[]=23&category_ids[]=190003341&category_ids[]=190003350 的格式。可以使用 Delphi 内置的 TJSON 单元解析 JSON 数据,然后使用循环遍历数组元素,将其拼接成正确的格式。
以下是示例代码:
var
datastr: string;
jsonToSend: TStringStream;
sResult: string;
sGetTokenURL: string;
begin
datastr := '{"name":"蜂窝纸70克30宽50米-中强",
"product_no":"CN.01.0700308888001",
"cn_name":"蜂窝纸70克30宽50米-中强",
"category_ids":[23,190003341,190003350],
"group_id":"纸垫类成品",
"6076727299027":"HP-Z-30-70-50",
"cost_currency":"USD",
"cost":"0",
"cost_unit":""}';
IdHTTP1.Request.Accept := 'application/json';
IdHTTP1.HandleRedirects := True;
IdHTTP1.Request.ContentType := 'application/json';
IdHTTP1.Request.CustomHeaders.Text := 'Authorization:' + crmtoken;
sGetTokenURL := 'https://xxxxx.cn';
jsonToSend := TStringStream.Create(datastr, TEncoding.UTF8);
try
sResult := IdHTTP1.Post(sGetTokenURL, jsonToSend);
finally
jsonToSend.Free;
end;
// 处理响应
end;
在上述代码中,我们使用了 TStringStream 将 datastr 包装成一个 JSON 格式的数据流,然后将其作为 POST 请求的正文发送给服务器。同时,我们指定了请求的 Content-Type 为 application/json,这样服务器就可以正确解析我们发送的 JSON 数据。如果服务器返回的响应也是 JSON 格式的数据,您可以使用 Delphi 内置的 TJSONObject 或第三方库(如 SuperObject)来解析响应。