使用JSON作为HTTP GET输入参数是否有效的RESTful服务?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用JSON作为HTTP GET输入参数是否有效的RESTful服务?相关的知识,希望对你有一定的参考价值。

我有以下Backend API:

Endpoint

HTTP GET

https://localhost:8443/getSomeParameterInfo

Query Parameter

?inputAsJson

{
  'url': 'http://semanticstuff.org/blah#Parameter,
  'parameters_1': 'value1',
  'someArray': [
     'http://semanticstuff.org/blah#something1,
     'http://semanticstuff.org/blah#something2
  ],
  'someOtherArray': [
     'http://....'
  ]
}

最终的HTTP GET调用是

https://localhost:8443/getSomeParameterInfo?inputAsJson= {aboveMentioned JSON}

由于后端的需求不断变化,上面提到的JSON结构通过添加新的键:值对而不断增加。 (此JSON结构也是对数据库的查询)

Hinderances

由于使用weblinks作为值,因此有必要使用encodeURIComponent函数来成功进行REST调用。这意味着,需要对引号,正斜杠等进行编码以获得回复。当需要在独立的基础上进行测试时(使用Postman或其他REST客户端),这变得相当繁琐

我没有看到如上所述传递给API的JSON结构,因此我希望确认在进行这样的RESTful调用时使用大量参数的最佳实践和/或正确方法

答案

我通常倾向于认为通过POST获取某些东西是一种“坏”的做法。

然而,听起来像GET中的身体不是禁止的东西,但仍然没有在框架中广泛实施。

在您的情况下,它将取决于您拥有多少属性和全局长度或您的json。

如果你继续使用GET方法,那么使用你的JSON的“爆炸”键值表示应该是要走的路。

例: { "myKey": "myValue", "childObjKey": {"childObjProp": "childValue}} 可能成为 ?myKey=myValue&childObjKey.childObjProp=childValue

但是查询参数的长度有一些限制,可以在客户端和/或服务器中实现。如果您的参数数量很大且值的长度不可预测(例如文本没有长度限制),那么使用POST应该是可行的方法。

以上是关于使用JSON作为HTTP GET输入参数是否有效的RESTful服务?的主要内容,如果未能解决你的问题,请参考以下文章

Flask:使用数组参数实现 HTTP GET

怎么处理get传递的参数带有

使用请求将 json 输入传递给 API

使用JSON主体的HTTP GET请求是否有大小限制?

javascript 检查提供的参数是否是有效的JSON

如何使用 MVC Web Api GET 将对象作为参数传递