HTTP params条目共享相同的密钥

时间:2016-07-02 18:49:44

标签: javascript http meteor

此Meteor服务器代码使用HTTP 1.1.7发出POST请求以匹配我使用java所做的操作,但我无法弄清楚如何在具有相同密钥的请求参数中包含多个条目。

//in java 'working'
HttpParams javaParams = new HttpParams();
javaParams.add('food','milk')
javaParams.add('food', 'water')
javaParams.add('food', 'ice')

javaParams.encodeParameters("UTF-8");


//in javascript 'not working'
let headerObject {
  "Content-Type"   : "application/x-www-form-urlencoded", 
  'Accept-Language': 'en-US,en;q=0.5'
   and others
}
const response = HTTP.call('POST', myUrl, {
  timeout: 30000,
  headers: headerObject,
  params: {
    'food': 'milk',
    'food': 'water',
    'food': 'ice'
  }
});

//also tried these but server returned status code 500
food: ['milk', 'water', 'ice']
'food[]': ['milk', 'water', 'ice']

怎么做到这一点?感谢

1 个答案:

答案 0 :(得分:0)

在JavaScript中,只需使用数组:

const response = HTTP.call('POST', myUrl, {
  timeout: 30000,
  headers: headerObject,
  params: {
    food: ['milk', 'water', 'ice']
  }
});

但是,服务器端的不同语言使用不同的机制来处理参数数组。虽然Java应该使用上面的代码,但PHP例如需要参数名称包含方括号,因此调用需要

const response = HTTP.call('POST', myUrl, {
  timeout: 30000,
  headers: headerObject,
  params: {
    'food[]': ['milk', 'water', 'ice']
  }
});

在当前情况下,服务器端似乎期望请求内容的单独行中的每个条目作为键=值对,每个键是“食物”。遗憾的是,这不能用JavaScript数组或JavaScript对象完成。

为避免此问题,我们使用data代替params。这可以防止HTTP.call()从给定的data创建params。它只需要我们自己处理参数的连接:

const response = HTTP.call('POST', myUrl, {
  timeout: 30000,
  headers: headerObject,
  data: "food=milk\nfood=water\nfood=ice"
});