swift 4 - разница между Alamofire и Retrofit (Post @Body Class) - PullRequest
0 голосов
/ 09 января 2019

Я отправил свой класс Android с помощью "модифицированной библиотеки" (например, alamofire), и сервер может проанализировать его успех но когда я использую "alamofire", сервер не может найти мои параметры, и я получаю ноль

Я думаю, это потому, что я отправил Body в Java, а в Swift я отправляю параметры, и это не похоже на тело

пример Android

Класс:

public class Car implements Serializable {

@SerializedName("strMobileNumber") //<--- serialize
private String strMobileNumber= "";
@SerializedName("strOfficialIMEI")
private String strOfficialIMEI= "";
// ... geter and setter...

конечная точка дооснащения:

@POST("/Rest/Login") // <== post
Call<Car> getLogin(@Body Car car); //// **<=== @BODY**

Запрос:

private void postRequest(Car car) {
    ApiService apiService = ApiClient.getClient().create(ApiService.class);
    Call<Car> call = apiService.getLogin(car);
    call.enqueue(new Callback<Car>() {
        @Override
        public void onResponse(Call<Car> call, Response<Car> response) {
            stopLoading();
            if (response.isSuccessful() && response.body() != null) {
                switch (response.body().getResult()) {
                    case "1":
                        //do somrthing
                        break;
                    case "0":
                        //do somrthing
                        break;
                    default:
                        //do somrthing
                        break;
                }
            } else {
                //do somrthing
            }
        }

        @Override
        public void onFailure(Call<Car> call, Throwable t) {
           //do somrthing
        }
    });
}

----------------------------------------------- -----------------------


Я пробую это для alamofire, но сервер не может разобрать мои параметры:

мой класс:

class User: Codable {
    private var strMobileNumber: String
    private var strOfficialIMEI : String

    init(strMobileNumber: String, strOfficialIMEI: String) {
       self.strMobileNumber = strMobileNumber
       self.strOfficialIMEI = strOfficialIMEI
    }

    func toParams () -> [String : Any] {
        return [
            "strMobileNumber" : self.strMobileNumber as Any,
            "strOfficialIMEI" : self.strOfficialIMEI as Any
        ]
    }
}

мой запрос:

Alamofire.request(Values.connection.url("Login") , method: .post, parameters: params, encoding: URLEncoding.default, headers: ["Content-Type":"applocation/json"]).responseJSON { (response) in
       switch response.result {
       case .success(let json):
           let dict = json as? [String: Any]
           print(dict!["<KEY>"])
           break
       case .failure(let error):
           print(error)
           break
       }
   }

swift 4.2 alamofire 4.7

Ответы [ 2 ]

0 голосов
/ 09 января 2019

В вызове API необходимо внести 2 изменения:

  • Изменить метод кодирования на JSONEncoding.default
  • Изменить значение заголовков на ["Content-Type":"application/json"]

URLEncoding.default используется, когда мы передаем данные в сам URL. Если мы хотим передать данные в теле, мы должны использовать JSONEncoding.default

Также существует ошибка правописания в типе содержимого заголовка.

0 голосов
/ 09 января 2019

Я думаю, что метод кодирования параметров Alamofire Неправильно, вам может понадобиться инстант URLEncoding.default, чтобы использовать JSONEncoding.default

...