RxJS v5:如何使用参数发出 POST 请求?
RxJS v5: How to make a POST request with params?
我有一些 RxJS 代码,这是其中的一部分:
.mergeMap(action => {
const user = store.getState().user;
return ajax.post(`${config.API_BASE_URL}/api/v1/rsvps`, {
rsvp: {
meetup_id: action.payload,
user_id: user.id,
}
})
.map(action => calendarActions.rsvpAdded(action.payload));
})
但是,我的服务器告诉我参数格式不正确:
[info] POST /api/v1/rsvps
[debug] Processing by ParrotApi.RsvpController.create/2
Parameters: %{"rsvp" => "[object Object]"}
Pipelines: [:api_auth]
[info] Sent 400 in 10ms
我尝试使用 JSON.stringify,但没有用。它只是让我的参数成为一个字符串。
rsvp: JSON.stringify({
meetup_id: action.payload,
user_id: 123,
})
Parameters: %{"rsvp" => "{\"meetup_id\":1,\"user_id\":123}"}
我不知道你的服务器需要什么参数格式,但如果你想发送 JSON 有效载荷,你还应该包括正确的 headers Content-Type: application/json
。使用 RxJS 5 就像下面这样:
ajax.post('url', {param: 42}, { 'Content-Type': 'application/json' });
现在,body 负载将自动转换为 JSON。 (参见 AjaxObservable.ts#L286。
或者,如果您不想发送 headers,您需要自己将整个 object 转换为 JSON:
ajax.post('url', JSON.stringify({param: 42}));
顺便说一下,您绝对不想将这两种方法结合使用(包括 headers 和自己调用 JSON.stringify
),因为这会将相同的有效负载转换为 JSON两次。
我有一些 RxJS 代码,这是其中的一部分:
.mergeMap(action => {
const user = store.getState().user;
return ajax.post(`${config.API_BASE_URL}/api/v1/rsvps`, {
rsvp: {
meetup_id: action.payload,
user_id: user.id,
}
})
.map(action => calendarActions.rsvpAdded(action.payload));
})
但是,我的服务器告诉我参数格式不正确:
[info] POST /api/v1/rsvps
[debug] Processing by ParrotApi.RsvpController.create/2
Parameters: %{"rsvp" => "[object Object]"}
Pipelines: [:api_auth]
[info] Sent 400 in 10ms
我尝试使用 JSON.stringify,但没有用。它只是让我的参数成为一个字符串。
rsvp: JSON.stringify({
meetup_id: action.payload,
user_id: 123,
})
Parameters: %{"rsvp" => "{\"meetup_id\":1,\"user_id\":123}"}
我不知道你的服务器需要什么参数格式,但如果你想发送 JSON 有效载荷,你还应该包括正确的 headers Content-Type: application/json
。使用 RxJS 5 就像下面这样:
ajax.post('url', {param: 42}, { 'Content-Type': 'application/json' });
现在,body 负载将自动转换为 JSON。 (参见 AjaxObservable.ts#L286。
或者,如果您不想发送 headers,您需要自己将整个 object 转换为 JSON:
ajax.post('url', JSON.stringify({param: 42}));
顺便说一下,您绝对不想将这两种方法结合使用(包括 headers 和自己调用 JSON.stringify
),因为这会将相同的有效负载转换为 JSON两次。