Tomcat 无法解析POST请求的参数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tomcat 无法解析POST请求的参数相关的知识,希望对你有一定的参考价值。
参考技术A 这几天碰到一个问题。服务发布后,无法接收post请求。准确的说,所有post请求的参数都为空。为什么会出现这种情况呢?首先,得明确所有的post请求都是存放在http body里面的。之所以通常我们可以通过getParamenter(name)去获取参数,是因为容器(tomcat, jetty等)对http body的内容进行了处理,把参数读取到了paramenterMap里面。
接下来去解决问题。
网上说有一种情况,说我的请求是multiplepart的方式。显然不是这个原因,我已经加了这样的拦截,如果是multiple-part,直接转成MultipartRequest。况且,通过请求头的打印,可以验证这一点。
还有一种说法,就是我在getParamenter之前就调用了getInputStream或者getReader。因为这两个方法只能读取一次,第二次读取的时候就为null。getParamenter其实第一次也是从http body里面读取一次。所以,如果getParamenter如果发生在getInputStream之后,那么getParamenter是没有值的。但是也明显不是这个原因。因为,程序之前是好的,后面偶然发生的这个问题。为了验证这个,我还在getParamenter之后打印了http body里面的内容。没有问题。如果真的需要多次调用getInputStream,可以通过重写HttpServletRequestWrapper来实现这个。推荐一篇 博客
那么现在问题来了,具体是什么原因呢。之前用的tomcat8的容器,现在把tomcat8删掉,换一个tomcat7。一切正常,post请求能正常接收。那肯定是tomcat的配置错了。经过仔细比对,终于发现了问题的所在。之前为了上传文件,设置了取消post请求限制maxPostSize=0。但是,tomcat8以后,maxPostSize必须小于0才能关闭post请求大小的限制。所以把maxPostSize的值改为-1就正常了。
有时候,在解决一个问题的过程中,往往会让你对某个技术点有更深入的了解。所以,不要怕遇到问题,重要的是遇到问题后能形成解决问题的思路。
快速解析时无法在json post请求参数中添加文本字段输入的文本
【中文标题】快速解析时无法在json post请求参数中添加文本字段输入的文本【英文标题】:Unable to add textfield entered text in json post request parameter while parsing in swift 【发布时间】:2019-11-21 09:23:41 【问题描述】:最初,我从以前的视图控制器获取文本字段文本,以了解要在当前视图控制器中添加的文本。如果我在文本字段中点击,以前的文本将为空并且我正在添加文本,但该文本我无法添加当前视图控制器后参数..这里我也得到了以前的视图控制器文本。
这是我的代码:
@IBOutlet weak var tableView: UITableView!
var cell : BillerTableViewCell?
var textFieldArray = [String]()
var selectedBiller: JsonDataBiller?
var toplabeText: String?
var textFieldValue: String?
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
cell = tableView.dequeueReusableCell(withIdentifier: "textfieldCell", for: indexPath) as! BillerTableViewCell
cell?.searchTextfield.delegate = self
if let param = selectedBiller?.bcustomerparms[indexPath.row]
cell?.searchTextfield.text = param.paramName
textFieldValue = cell?.searchTextfield.text
else
cell?.searchTextfield.text = "missing data"
return cell!
func textFieldDidBeginEditing(_ textField: UITextField)
textField.text = ""
func textFieldShouldReturn(_ textField: UITextField) -> Bool
textField.resignFirstResponder()
return true
@objc func buttonClicked(sender: UIButton)
billerFetchService()
func billerFetchService()
print("fetch paramname \(textFieldKey)")
// var textFieldValue: String = (cell?.searchTextfield.text)!
let parameters = ["billDetails": [
"billerId" : "EPDCLOB00ANP01",
"customerParams" : [["name": textFieldKey,"value": textFieldValue]]]] as [String : Any]
print("the textfield value is \(textFieldValue)")
let url = URL(string: "https://app.com/emi_v1/fetch")
var req = URLRequest(url: url!)
req.httpMethod = "POST"
req.addValue("application/json", forHTTPHeaderField: "Contet-Type")
req.addValue("application/json", forHTTPHeaderField: "Accept")
guard let httpBody = try? JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted) else return
req.httpBody = httpBody
let session = URLSession.shared
session.dataTask(with: req, completionHandler: (data, response, error) in
if response != nil
// print(response)
if let data = data
do
var json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as! [String: Any]
// print("fetching json \(json)")
let fetchStatus = json["status"] as? String
if fetchStatus == "sucess"
let billerDetails = json["response"] as! [String:Any]
let value = billerDetails["billerResponse"] as! String
print(value)
let res = try JSONSerialization.jsonObject(with:Data(value.utf8)) as! [String: Any]
self.billerName = res["billerName"] as? String
var consumName = res["customerName"] as? String
print("fetch only APEPDCL biller name \(self.billerName)")
DispatchQueue.main.async
let nextViewController = self.storyboard?.instantiateViewController(withIdentifier: "FetchBillerViewController") as? FetchBillerViewController
nextViewController?.nameText = self.billerName
nextViewController?.consumrName = consumName
self.navigationController?.pushViewController(nextViewController!, animated: true)
else
DispatchQueue.main.async
AlertFun.ShowAlert(title: "", message: "Invalid service Number", in: self)
catch
print("error")
).resume()
【问题讨论】:
直接使用textfield.text!获得你的价值。使用 KeychainWrapper 有什么需要? @KeshuRai,我没有使用 ketchain,那是用于另一个领域...我已经删除了那行 好的。让 finalString = yourTextField.text! .. 现在在您的请求中传递这个 finalString @KeshuRai,如果文本字段在视图中,但文本字段在表格视图中,这就是为什么..请帮助 @KeshuRai,请看一下我的cellForRowAt
...如何添加
【参考方案1】:
在视图控制器中声明一个变量来存储最终值。
var finalSearchValue : String = ""
现在在你的 cellForRowAtIndexPath 方法中添加这一行:
cell.searchFieldText.addTarget(self, action: #selector(searchEditingChanged(textField:)), for: .editingChanged)
现在在你的视图控制器中声明这个函数:
@objc func searchEditingChanged(textField: UITextField)
finalSearchValue = textField.text!
就是这样。您的 finalSearchValue 变量现在包含输入文本。将它用于您的 api 请求。
如果有任何问题,请告诉我。
【讨论】:
:) 很高兴为您提供帮助以上是关于Tomcat 无法解析POST请求的参数的主要内容,如果未能解决你的问题,请参考以下文章
无法通过 @POST 请求使用 Retrofit 解析 JSON 响应和参数
快速解析时无法在json post请求参数中添加文本字段输入的文本