Moya中的参数编码

Posted

技术标签:

【中文标题】Moya中的参数编码【英文标题】:Parameter Encoding in Moya 【发布时间】:2020-03-19 09:27:06 【问题描述】:

我的项目在 Objective-C 中,我正在将其转换为 Swift。 Objective-C 项目使用AFNetworking 进行联网。在新的 swift 项目中,我使用Moya

我创建了名为 PhTrackerAPI 的 Moya 目标,

public enum PhTrackerAPI 
    case login
    case checkNumberExist(phoneno: String, code: String)
    case todos


extension PhTrackerAPI: TargetType 
  public var baseURL: URL 
    return URL(string: "http://numberfinding.com/vaghani/call2loc/Api_c2l")!
  

  public var path: String 
    switch self 
    case .login: return "/login"
    case .checkNumberExist: return "/check_number_exist"
    case .todos: return "/todos"
    
  

  public var method: Moya.Method 
    switch self 
    case .login, .checkNumberExist:
        return .post
    case .todos:
        return .get
    
  

  public var sampleData: Data 
    return Data()
  

    var parameters: [String: Any]? 
        switch self 
        case .login:
            return [:]

        case .checkNumberExist(let phoneno, let code):
            return ["phone":phoneno,
                    "country_code":code]

        case .todos:
            return nil

        
    

  public var task: Task 
    switch self 
    case .login, .checkNumberExist:
        return .requestParameters(parameters: parameters!, encoding: JSONEncoding.default)
    default: return .requestPlain
    
  

  public var headers: [String: String]? 
    return ["Content-Type": "application/json"]
  

  // 7
  public var validationType: ValidationType 
    return .successCodes
  

当我向 Postman 请求 API 时,它会给出响应,但如果我通过 Moya 调用它,它会给出“找不到参数”的错误。为什么会出现这个错误?谁能帮帮我?

编辑:

【问题讨论】:

可能你有public enum,并将所有计算属性声明为public var,但parameters 没有明确声明为public? 这不是问题。如果我打印从这里成功传递的参数。但它没有进入后端。 @IliyaKisliy 您能附上您的邮递员请求吗? @komal-goyani 【参考方案1】:

我的 API 需要表单数据中的参数。所以我更新了如下任务,现在可以正常工作了。

 var task: Task 
    switch self 
    case .checkNumberExist:
         var multipartData = [MultipartFormData]()
               for (key, value) in parameters! 
                   let formData = MultipartFormData(provider: .data("\(value)".data(using: .utf8)!), name: key)
                   multipartData.append(formData)
               
               return .uploadMultipart(multipartData)
    default: return .requestPlain
    
 

【讨论】:

以上是关于Moya中的参数编码的主要内容,如果未能解决你的问题,请参考以下文章

Moya/Alamofire - 具有相同键的 URL 编码参数

Moya任务中的可选参数

使用 Moya 将参数附加到每个网络调用

BDD 测试中的 Moya 存根请求

Tomcat中的Grails请求参数编码问题

由于 URL 中的参数编码,Codeigniter 控制器失败