当前位置: 首页 > 面试题库 >

NodeJS:验证请求类型(检查JSON或HTML)

彭兴朝
2023-03-14
问题内容

我想检查我的客户请求的类型是JSON还是HTML,因为我希望自己的路线能够同时满足人和机器的需求。

我在以下位置阅读了Express 3文档:

http://expressjs.com/api.html

有两种方法req.accepts()req.is(),使用方法如下:

req.accepts('json')

要么

req.accepts('html')

由于这些无法正常工作,因此我尝试使用:

var requestType = req.get('content-type');

要么

var requestType = req.get('Content-Type');

requestType总是undefined

也不起作用。我究竟做错了什么?

编辑1 :我已经检查了正确的客户端HTML协商。这是我的两个不同的请求标头(来自调试器检查器):

HTML: Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

JSON: Accept: application/json, text/javascript, */*; q=0.01

解决方案 (感谢Bret):

原来我指定的Accept标头错误,这*/*就是问题所在。这是有效的代码!

//server (now works)
var acceptsHTML = req.accepts('html');
var acceptsJSON = req.accepts('json');

if(acceptsHTML)  //will be null if the client does not accept html
{}

我正在使用JSTREE,这是一个在下面使用jQuery Ajax调用的jQuery插件。传递给Ajax调用的参数位于“ ajax”字段中,而我已将“accepts”参数替换为完整的“headers”对象。现在它可以工作了,如果使用纯jQuery,应该可以解决该问题。

//client

.jstree({
            // List of active plugins
            "plugins" : [
                "themes","json_data","ui","crrm","cookies","dnd","search","types","hotkeys","contextmenu"
            ],

            "json_data" : {
                "ajax" : {
                    // the URL to fetch the data
                    "url" : function(n) {
                        var url = n.attr ? IDMapper.convertIdToPath(n.attr("id")) : "<%= locals.request.protocol + "://" + locals.request.get('host') + locals.request.url %>";
                        return url;
                    },
                    headers : {
                        Accept : "application/json; charset=utf-8",
                        "Content-Type": "application/json; charset=utf-8"
                    }
                }
            }
        })

问题答案:

var requestType = req.get('Content-Type');如果在请求中实际指定了内容类型,则绝对有效(我刚刚在几分钟前对此进行了重新验证)。如果未定义内容类型,则它将是未定义的。请记住,通常只有POST和PUT请求会指定内容类型。其他请求(例如GET)通常会指定接受类型的列表,但这显然不是同一回事。

编辑:

好吧,我现在更好地理解了你的问题。您在谈论的是Accept:标头,而不是内容类型。

这是正在发生的事情:请注意*/*;q=0.8列出的接受类型末尾的?本质上说“我会接受任何东西”。因此,req.accepts('json')总是会返回,"json"因为从技术上讲,它是一种可接受的内容类型。

我认为您想要的是查看是否application/json已明确列出,如果是,则以json响应,否则以html响应。这可以通过以下两种方法完成:

// a normal loop could also be used in place of array.some()
if(req.accepted.some(function(type) {return type.value === 'application/json';}){
    //respond json
} else {
    //respond in html
}

或使用简单的正则表达式:

if(/application\/json;/.test(req.get('accept'))) {
    //respond json
} else {
    //respond in html
}


 类似资料:
  • 我正在spring boot rest中对请求对象进行验证。我必须验证请求的数据类型。该请求有多个布尔值,并试图验证是否为布尔数据类型传入了字符串。我在ControllerAdvice类中处理了HttpMessageOnTreadableException,并发送了错误消息列表。但在我的回答中,只有第一个字段抛出异常。如果有线索,请帮忙。

  • 问题内容: 如何检测PHP中使用了哪种请求类型(GET,POST,PUT或DELETE)? 问题答案: 通过使用 例

  • 问题内容: 我是新手。我正在尝试为使用JSON进行身份验证的移动应用程序编写API。我想使用Devise进行身份验证。我相信Devise> 1.3也增加了对JSON的支持,但是我找不到关于它的任何示例或文献。 有人可以为我提供任何相关资源或提供示例代码吗? 谢谢!萨蒂扬 问题答案: 也许这> http://jessehowarth.com/devise? 我计划在一两周内做同样的事情。

  • 在我的spring-boot服务中,我使用https://github.com/java-json-tools/json-patch用于处理PATCH请求。 一切似乎都很好,除了一种避免修改不可变字段的方法,如对象ID、creation_time等。我在Github上发现了一个类似的问题https://github.com/java-json-tools/json-patch/issues/21我

  • 我有一个设置为接收来自WooCommerce的网络钩子的Rails应用程序。具体来说,我正在寻找创建订单的时间。我已经测试并验证了它在我protect_from_forgery时是否有效,除了创建。现在我正在尝试通过验证网络钩子来保护我的应用程序。WooCommerce的留档声明在请求标头中传递以下秘密: 秘密:一个可选的密钥,用于生成请求正文的HMAC-SHA256哈希,以便接收者可以验证Web

  • TP5提供了很多请求判断的方法,如下: // 是否为 GET 请求 $request->isGet(); // 是否为 POST 请求 $request->isPost(); // 是否为 PUT 请求 $request->isPut(); // 是否为 DELETE 请求 $request->isDelete(); // 是否为 Ajax 请求 $request->isAjax();