【问题标题】:RxJS v5: How to make a POST request with params?RxJS v5:如何使用参数发出 POST 请求?
【发布时间】:2017-09-13 00:26:01
【问题描述】:

我有一些 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}"}

【问题讨论】:

  • 这个问题可能与 ajax.post() 做什么/不做什么而不是 RxJS 有关。
  • 它是从可观察的 rxjs 导入的:import { ajax } from 'rxjs/observable/dom/ajax';

标签: javascript ajax rxjs rxjs5 redux-observable


【解决方案1】:

我不知道您的服务器期望什么参数格式,但如果您想发送 JSON 有效负载,您还应该包含正确的标头 Content-Type: application/json。使用 RxJS 5 如下所示:

ajax.post('url', {param: 42}, { 'Content-Type': 'application/json' });

现在,正文负载将自动转换为 JSON。 (见AjaxObservable.ts#L286

或者,如果您不想发送标头,则需要自己将整个对象转换为 JSON:

ajax.post('url', JSON.stringify({param: 42}));

顺便说一句,您绝对不想组合这两种方法(包括标头和自己调用 JSON.stringify),因为这会将相同的有效负载转换为 JSON 两次。

【讨论】:

  • { 'Content-Type': 'application/json' } 完成了这项工作!非常感谢
猜你喜欢
  • 2015-03-05
  • 1970-01-01
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 2022-01-24
  • 2021-04-04
  • 2012-04-20
  • 2018-06-29
相关资源
最近更新 更多