【问题标题】:How to read JSON in GET request query parameter如何在 GET 请求查询参数中读取 JSON
【发布时间】:2017-08-11 16:21:54
【问题描述】:

我必须使用 GET 请求的查询参数从 URL 读取 JSON 值。 我在 Spring Boot 项目中使用了最新的 Tomcat。

       @RequestMapping(
            value = "/values",
            method = RequestMethod.GET, 
            headers = HttpHeaders.ACCEPT + "=" + MediaType.APPLICATION_JSON_VALUE,
            produces = "application/json")
       public ResponseEntity<String> myMethod(
            @RequestParam(value="key") String jsonRequestString) {
       //parse JSONString 
       //--
       }

对 URL 的 GET 请求

网址:- http://localhost:port/values?key={"org":"AA","points":[{"name":"xy","Measures":"343"}]}]

投掷 java.lang.IllegalArgumentException:在请求目标中发现无效字符。有效字符在 RFC 7230 和 RFC 3986 中定义

编辑:- 以原始形式发送 JSON 导致我无处可去,因此工作方法是以编码形式发送 JSON。

【问题讨论】:

  • 正如错误所说,这不是一个有效的 URL。您需要在发送 JSON 内容 之前 对其进行 URL 转义,或者(更好)使用 POST 并将 JSON 放入请求正文中。
  • 我无法对 JSON 进行编码。
  • 我无法对请求参数或请求类型进行任何更改。
  • 我需要以某种方式接受这些价值观。对此有任何建议
  • 这个问题可能会有所帮助:stackoverflow.com/questions/41053653/… 简而言之,如果客户端没有转义查询参数,您可能别无选择,只能降级到较旧的 Tomcat 版本。

标签: java spring rest spring-mvc spring-boot


【解决方案1】:

您可以将关键参数编码为 Base64 格式并附加在 url 中,然后解码并在您的控制器方法中使用它。

key json 文本 {"org":"AA","points":[{"name":"xy","Measures":"343"}]}]

Base 64 编码文本 eyJvcmciOiJBQSIsInBvaW50cyI6W3sibmFtZSI6Inh5IiwiTWVhc3VyZXMiOiIzNDMifV19XQ==

再次解码为 json 文本 {"org":"AA","points":[{"name":"xy","Measures":"343"}]}]

【讨论】:

  • 我不是发送请求的人。我无法更改请求格式。
  • 查看这篇文章中提出的解决方案stackoverflow.com/a/21689084/2633386
  • 仍然给我例外
  • 您遇到了什么异常?是一样的还是弹簧相关的?如果有任何配置问题,请检查上面链接中的评论
  • Spring MVC 4,@RequestBody Map 映射与输入 json {"name":"frank","Type":"Lumber"} 一起使用。
【解决方案2】:

您可以直接将String传递给JSONObject构造函数

有很多可用的库。

1.http://www.java2s.com/Code/Jar/j/Downloadjavajsonjar.htm(JSON 罐子)

2.http://www.java2s.com/Code/Jar/j/Downloadjsonsimple11jar.htm(简单 JSON)

3.http://www.java2s.com/Code/Jar/g/Downloadgson224sourcesjar.htm(来自谷歌的 GSON)

我个人使用 JSON 和 GSON jars。

JSONObject jsonObject = new JSONObject(variable)

【讨论】:

  • 我不是在寻找将 JSONString 解析为 Object 而是在我的查询参数中接受 JSON
  • 将参数的 RHS 放在引号中并在发送到服务器之前进行编码。您可以在服务器端解码文本并转换为您希望的任何格式
  • 我无法更改。我宁愿将参数更改为 JSONObject
  • “我无法改变”是什么意思。 HTTP标准就是http标准,如果说只能使用某些字符,那就是:stackoverflow.com/questions/1547899/…
  • Http 标准不禁止使用上述值。请阅读整个问答
【解决方案3】:

你应该注意的几件事。

  1. 使用 POST HTTP 方法将您的 JSON 发布到服务器。
  2. 创建一个应该与 JSON 具有相同结构的 JAVA pojo 类。就像下面的 JSON,

      {
            "id": 123,
            "status": "Ordered",
            "product": "Pepsi"
           } 

我会创建一个类(你可以创建一个两个单独的类,因为你在 json 中有数组),

公开课令{

private long id ;
private String status; 
private String product ;

public long getId() {
    return id;
}
public void setId(long id) {
    this.id = id;
}
public String getStatus() {
    return status;
}
public void setStatus(String status) {
    this.status = status;
}
public String getProduct() {
    return product;
}
public void setProduct(String product) {
    this.product = product;
} 

}

  1. 那么,

      @RequestMapping(value = "/values", method = RequestMethod.POST,produces={"application/json"},
                consumes={"application/json"})
        public ResponseEntity myMethod(
                    @RequestBody Order orderObj) {
        }

请参考此示例并构建解决方案。

【讨论】:

  • 我无法从 GET 更改请求类型
  • 这不是在 URL 中发送 JSON 格式参数的理想方式。您必须对其进行编码或使用 POST 方法。无论如何,如果您让 GET 正常工作,那么您最终也会遇到其他问题,因为您所期望的并不是处理 JSON 的理想方式。
  • 是的。我了解您的保留意见。问题是这可以在我们采用不同技术的其他应用程序中无缝运行。所以我需要以完全相同的方式执行此操作。
【解决方案4】:

你可以简单地尝试这样的事情

@GetMapping(value = "/values", produces = MediaType.APPLICATION_JSON_VALUE)
@Timed
public ResponseEntity<String> testMethod(@RequestParam("key") String key) throws Exception {
    JSONObject jsonObject = new JSONObject(key);
    //
}

【讨论】:

  • 对上述 URL 抛出非法参数异常
  • @jonesjalapat 我认为您的 Maven 依赖项有问题。请重新检查
猜你喜欢
  • 1970-01-01
  • 2020-08-26
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-29
相关资源
最近更新 更多