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请求参数中添加文本字段输入的文本

解析来自 Node js + 车把的 POST 请求

python发送post请求上传文件,无法解析上传的文件

Swift Alamofire 无法解析 POST 请求中的响应 JSON 字符串

System.InvalidOperationException:无法解析类型的服务 [重复]