Ваш способ отправки тела в порядке. Если вы посмотрите на фактический отправленный запрос (например, с помощью Fiddler или Wireshark), вы увидите, что тело отправлено правильно. Проблема в другом - вместо этого вы увидите, что заголовки не точно такие же.
Использование json
(либо с json: true
и body
, либо как вы сделайте это, используя json
в качестве объекта) также автоматически устанавливает заголовок Accept
на application/json
и пытается проанализировать ответ как JSON.
Кажется, что на этом сервере chiguotest.ytoglobal.com
есть ошибка , где он возвращает JSON, но неправильно обрабатывает заголовок Accept
(я тестировал его, и похоже, что сервер «думает», что он возвращает text/plain
). Итак, request
(правильно) сообщает серверу: «Я ожидаю, что вы вернете JSON», но сервер говорит: «Что, JSON? Нет, я не знаю, как вернуть JSON, только текст, извините . ". Тем не менее, он действительно возвращает JSON.
Вы можете обойти эту ошибку сервера, явно отправив заголовок Accept: */*
:
request.post({
url: url,
headers: {
"data_digest": 'muZ7EcapQZV',
"partner_code": "ebfebc241db9b9c",
"msg_type": "GET_BASEDATA_TRANSPORT",
"msg_id": '1590464383047',
"Accept-Language": "zh-cn",
"Accept": "*/*"
},
json: true,
body: {}
}, function(error, response, body) {
console.log(body);
});
Мой вывод:
{
"data": {
"productKinds": [
{
"productCnname": "(美国)测试用-不拉G单号",
"productCode": "1",
"productEnname": "1",
"productServerhawbcodeNeed": "Y"
},
{
"productCnname": "散客可见产品",
"productCode": "111",
"productEnname": "内部产品",
"productServerhawbcodeNeed": "N"
},
... many more entries ...
]
},
"errorCode": "SUCCESS",
"errorMsg": "成功",
"status": true
}