【问题标题】:iOS: Almofire PUT and DELETE Call is not working with Params in SwiftiOS:Almofire PUT 和 DELETE 调用不适用于 Swift 中的参数
【发布时间】:2021-07-15 10:33:44
【问题描述】:

我正在尝试通过 Almofire 库放置和删除数据,但面临有关参数的问题。参数丢失,错误如下:

Response JSON data = {
    data = "<null>";
    issuccess = 0;
    msg = "{'car_id': [ErrorDetail(string='This field is required.', code='required')], 'car_brand_id': [ErrorDetail(string='This field is required.', code='required')], 'last_oil_change': [ErrorDetail(string='Date has wrong format. Use one of these formats instead: YYYY-MM-DD.', code='invalid')]} with error {  Custom error message.  }";
} 

我正在使用以下代码:

let params : [String : String] = ["brand_model_id": String(car_model_id), "oil_brand_id": String(oil_brand_id), "car_mileage": edCurrentMilage.text!, "car_modelyear": edVehicleModelYear.text!, "last_oil_change": edLastOilChange.text!]


Alamofire.request(Constants.APIURL + Constants.APIPOSTCARDATA ,method:.put, parameters: params, encoding: JSONEncoding.default, headers: header).responseJSON { [self] response in
                guard response.result.isSuccess,
                    let value = response.result.value else {
                                print("Error while fetching tags: \(String(describing: response.result.error))")
                                self.hideIndicator()
            //                    self.btn_submit_outlet.isEnabled = true
                                // completion(nil)
                                return
                        }
                        print(value)
                        let json = JSON.init(value as! NSDictionary)
                        print(json)
                        let code = json["issuccess"].boolValue
                        if(code)
                        {
                            self.hideIndicator()
                            Commons.showAlert(title: "Alert", error: "Data has been added.", VC: self)
                        }
                        else
                        {
                            self.hideIndicator()
                            Commons.showAlert(title: String.localizedStringWithFormat(NSLocalizedString("Alert", comment: "")), error: String.localizedStringWithFormat(NSLocalizedString("Something went wrong.", comment: "")), VC: self)
                        }
                    }

上面提到的代码用于 PUT 调用请帮助。提前致谢。

【问题讨论】:

  • 正如您在错误消息中看到的,只需正确设置这些类别,就可以确保输出...
  • 你错过了两件事car_idcar_brand_id ,最后一部分日期格式应该是YYYY-MM-DD
  • 我已将这些添加为参数,但服务器没有获得参数,这就是它发送此错误的原因@jatinfl
  • “味精”的哪一部分你不明白?
  • @ElTomato 我使用相同参数的 Post 调用工作正常,但它不适用于 PUT 并返回参数丢失的错误。我想知道为什么 PUT 或 delete 调用中不接受参数?

标签: ios swift objective-c


【解决方案1】:

这并不是特别针对你,但是,这是这类问题中缺乏很多的东西。

通常,通过读取输出错误,在我们的例子中是服务器响应我们可能,我坚持“可能”,找到解决方案。但并非总是如此,有时错误消息过于笼统,或者指向错误的方向。在这里,错误是说缺少“car_id”参数,但根据你的说法,它是不需要的,所以它具有误导性(如果我们相信你的话)。

另一个通常很好的提示是说“它正在 Android 上运行”、“它正在 Postman 中运行”、“它正在使用 cURL 命令”。

通常,当这种情况发生时,我会问自己:
为什么作者没有展示 Postman、Android 代码、cURL 命令,这些命令可以让了解两种工具/语言/平台的人发现可能是错误的差异。

说实话,这样会更容易,不是吗?您可能很快就有了正确的解决方案/修复,不是吗?这比试图猜测与服务器响应的战斗要好,不是吗?

现在...

您正在使用 Alamofire 和 Postman。如果我告诉你这对你来说可能就够了怎么办?

小知识:
您知道 Postman 可以为请求生成代码吗?
它甚至可以使用 URLSession? 为您的请求生成 Swift 代码?它不是“漂亮”、“迅速”的 Swift 代码,但足以发现差异并找出它在 Postman 上而不是在你的代码中运行的原因。
也可以生成cURL command?如果您不了解cURL,快速解释将是“命令行工具,用于在 Terminal.app/Bash/Shell 中使用参数等进行 Web 请求,即:它是基本的,通常被很多开发人员所知道,所以即使如果你只会说 JavaScript、Java 等,它通常就像是一种“通用语言”
如何?即使我在 cmets 中这么说,人们甚至都不会尝试搜索它......让我们用你最喜欢的搜索引擎找到它,它应该会引导你到 this tutorial/blog post。还有 tadaaa!
您知道 AlamoFire 可以将请求打印为 cURL 等价物吗?上面写着here

那么在你的情况下,让 Alamofire 和 Postman 生成 cURL 命令并进行比较呢?
然后,您可能想要更改请求的参数,甚至是方法request(_:method:parameters:encoding:headers:) 的参数。

我为什么这么说?
因为如果您没有提供足够的信息,那么在有人在评论中询问更多信息/细节和您回复他们之间会有延迟。此外,不同的评论者会提出不同的问题,因为调试是一种技能,原因可能是多重的,我们可能会问不同的问题,最终只有一个与您的问题相关,但在那之前我们无法猜测是哪一个.
因为发现差异更容易,并且可能会吸引更快的响应。
既然您了解了 POSTMAN、Alamofire 和 cURL,您甚至可能会找到自己的解决方案。甚至比对 SO 提出问题还要快!做你自己的英雄!
最后,只有一个“有吸引力”的问题才会有好的答案,所以尽可能多地提供信息,不要持有它们(发送的参数,等效的android代码,至少是邮递员的截图,但要知道你知道cURL 生成代码)。当然,请保留您的私人令牌等,稍微混淆一下,但是,您可能已经观看了足够多的电视节目/电影,其中持有信息对主角不利,为什么在这里重复这个错误?

【讨论】:

    【解决方案2】:

    正如错误消息所说:日期格式错误。请改用以下格式之一:YYYY-MM-DD。

    请检查“last_oil_change”字段。该值来自 edLastOilChange.text。 edLastOilChange.text 是否符合要求的格式?

    【讨论】:

    • 不,这不是服务器没有获取参数的实际问题。
    • @MuhammadUmair 您可以从控制台看到请求输出。参数是否正确编码为 Json?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    相关资源
    最近更新 更多