溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

springboot中不能獲取post請求參數如何解決?

發布時間:2020-06-23 13:49:12 來源:億速云 閱讀:1394 作者:清晨 欄目:開發技術

這篇文章將為大家詳細講解有關springboot中不能獲取post請求參數如何解決?,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

問題描述

最近在做微信小程序,用的spring boot做后端,突然發現客戶端發送post請求的時候服務端接收不到參數。問題簡化之后如下:

微信小程序端:

在頁面放一個按鈕進行測試

<!--index.wxml-->
<view class="container">
 <button catchtap='testpost'>點擊進行測試</button>
</view>

綁定一個函數發送post請求

//index.js
//獲取應用實例
const app = getApp()

Page({
 testpost:function(){
  wx.request({
   url: 'http://127.0.0.1:8081/testpost/demo',
   method:'POST',
   data:{
    name:'lijing',
    age:'18'
   },
   success:function(res){
    console.log(res);
   },
   fail:function(err){
    console.log(err)
   }
  })
 }
})

如圖所示:

springboot中不能獲取post請求參數如何解決?

服務端

服務端新建一個springBoot項目,配置端口和路徑

server.port=8081
server.servlet.context-path=/testpost

再新建一個controller用于測試:

package com.demo.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 1. @author lijing
 2. @date 2019-03-31-20:19
 3. @discroption 測試post請求參數傳遞
 */
@RestController
public class TestController {
  @RequestMapping(value = "/demo",method = RequestMethod.POST)
  public String demo(String name,String age){
    System.out.println("name = [" + name + "], age = [" + age + "]");
    return "server response";
  }
}

可見,如果能獲取到參數的話就會在控制臺打印參數。
但是在小程序界面點擊按鈕之后,服務端并不能獲取到數據,如下:

springboot中不能獲取post請求參數如何解決?

解決方法

查閱資料之后發現,post請求提交數據有四種常見方式:

application/x-www-form-urlencoded
瀏覽器的原生 <form> 表單,其中ajax也是用這種方式提交的multipart/form-data
表單上傳文件用的這種提交方式application/json
這種提交方式的消息主體是一個json字符串text/xml
消息主體是XML格式的內容
再回到小程序中,檢查消息頭發現這里的提交方式為:application/json

springboot中不能獲取post請求參數如何解決?

所以在服務端進行接收的時候不能直接用參數接受,可以以流的形式來讀取json字符串,在用工具類來解析json數據,如下:

package com.demo.demo;

import com.alibaba.fastjson.JSONObject;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * @author lijing
 * @date 2019-03-31-20:19
 * @discroption 測試post請求參數傳遞
 */
@RestController
public class TestController {
  @RequestMapping(value = "/demo",method = RequestMethod.POST)
  public String demo(HttpServletRequest req){
    try {
      BufferedReader br = new BufferedReader(new InputStreamReader(req.getInputStream()));
      StringBuffer sb=new StringBuffer();
      String s=null;
      while((s=br.readLine())!=null){
        sb.append(s);
      }
      JSONObject jsonObject = JSONObject.parseObject(sb.toString());
      String name = jsonObject.getString("name");
      String age = jsonObject.getString("age");
      System.out.println("name:"+name+" age:"+age);
    } catch (IOException e) {
      e.printStackTrace();
    }
    return "server response";
  }
}

輸出如下:

springboot中不能獲取post請求參數如何解決?

上面用到的解析json的工具類:

<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>fastjson</artifactId>
   <version>1.2.28</version>
</dependency>

使用@RequestBody注解

@RequestBody是作用在形參列表上,用于將前臺發送過來固定格式的數據【xml 格式或者 json等】封裝為對應的 JavaBean 對象。所以上面代碼可以改為如下形式:

package com.demo.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
1. @author lijing
2. @date 2019-03-31-20:19
3. @discroption 測試post請求參數傳遞
*/
@RestController
public class TestController {
  @RequestMapping(value = "/demo",method = RequestMethod.POST)
  public String demo(@RequestBody Person person){
    System.out.println(person);
    return "server response";
  }
}
package com.demo.model;
import lombok.*;

@Data
class Person{
	private String name;
	private String age;
}

關于springboot中不能獲取post請求參數如何解決?就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女