【问题标题】:meteor iron-router header type not json流星铁路由器头类型不是json
【发布时间】:2015-02-18 17:07:52
【问题描述】:

我正在尝试将流星与 Iron-router 一起用于简单的 RESTful API,并且我已经验证,当我对我的 api 进行 POST 时,如果标头类型设置为“Content-Type: application/json”,那么我可以使用 var thisVar = this.request.body.myKey 解析 http 请求的正文,但是如果我不指定 Content-Type 当然默认是 application/x-www-form-urlencoded 并且正文不会被解析为 json。

然后我的问题是,我如何才能将我的内容“转换”为 JSON,因为它确实是 JSON。现在,你们中的大多数人可能会想“为什么不在 POST 请求中将 content-type 更改为 json”。嗯,答案是我不控制 POST,这是一个 3rd 方软件。我可以添加一个增强请求,但这需要几个月的时间,而且可能永远不会发生。

因此,我的问题再次是:在我的 Iron-router 中,我可以将我的 body 的内容类型“转换”为 json,以便我可以使用 var thisVar = this.request.body.myKey 格式轻松解析它

编辑

让我澄清一下,我已经有一个基本的工作 RESTful API 与 Iron-router 一起使用。当我将 curl 和 POST 与一些 json 数据一起使用并指定内容类型为 json 时,就像 curl -XPOST -H "Content-Type:application/json" -d"{\"myKey\":\"myValue\"}" http://localhost:3000/api/insert 那样,然后在我处理 POST 的路线中,我可以使用 var thisVar = this.request.body.myKey 解析正文,然后插入到我的 mongodb 等...没问题。

但是,客户端在未指定内容类型的情况下发布,因此默认值为 application/x-www-form-urlencoded,因此当我使用以下代码 var thisVar = this.request.body.myKey 时,值 thisVar 未定义,所以我不能轻松解析 http 请求的正文。

有意义吗?

【问题讨论】:

    标签: javascript json meteor http-headers iron-router


    【解决方案1】:

    是的,我正在回答我自己的问题,但希望它会对那里的人有所帮助。

    在一系列刚刚打印出的 http 响应之后,我发现我的原始数据具有以下特征,导致无法将其解析为 JSON 对象:

    1. 双引号的反斜杠转义
    2. “JSON.stringified”之后的整个原始字符串是一个带有双引号的键,然后基本上是一个空值。

    示例:{"{ \"myKey\" : \"ValueA\"}":""}

    我使用 string.replace() 函数来修复 #1 和 #2。 (见下面的示例代码)

    示例:{ "myKey" : "ValueA"}

    在应用修复 #1 和 #2 之后,我可以对 JSON 字符串执行 JSON.parse()。

    这是我修复 #1 和 #2 的代码:

    Router.route('/api/insert/test', function(){
    
    this.response.statusCode = 200;
    
    this.response.setHeader("Content-Type", "application/json");
    
    this.response.setHeader("Access-Control-Allow-Origin", "*");
    
    this.response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    
    
    
    var re = /\\/g;
    
    var re2 = /\{\"/g;
    
    var re3 = /\":\"\"\}/g;
    
    var json_str = JSON.stringify(this.request.body);
    
    var json_str_after_re = json_str.replace(re, '').replace(re2, '').replace(re3, '');
    
    var json = JSON.parse(json_str_after_re);
    
    
    
    this.response.end('this is ' + json_str_after_re + ' and value is ' + json.myKey);
    
    }, {where: 'server'});
    

    【讨论】:

    • 你为什么要先对正文进行 JSON.stringify 处理,只是为了使用正则表达式以一种非常奇怪的方式撤消它?
    【解决方案2】:

    使用 iron-router 制作 RESTful API 非常简单:

    Router.route('/webhooks/stripe', { where: 'server' })
      .get(function () {
       // GET /webhooks/stripe
    })
    .post(function () {
      // POST /webhooks/stripe
    })
    .put(function () {
      // PUT /webhooks/stripe
    })
    

    Source

    【讨论】:

    • 感谢 Daniel,这正是我正在做的,但在 .post 函数中我无法解析正文 this.request.body,因为在客户端的 POST 中未指定内容类型。
    • 我明白了...我只有一个智能手机自动取款机,所以我无法尝试任何事情,但我可以想象 this.request.body 可能是一个查询字符串,例如 name=value&name2=value2...是 url 编码的。在获取您的值之前,您必须对其进行解码:stackoverflow.com/questions/4671985/…
    • 在我的例子中 this.request.body 实际上是 json 格式的文本 "{ key":"value"}"
    • 嗨丹尼尔,不,它没有工作,直到我修复了身体。我想通了...看我的答案。
    猜你喜欢
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    相关资源
    最近更新 更多