Какова возможная ошибка для этого модифицированного кода?Я не могу понять связь моего API и MOBILE - PullRequest
0 голосов
/ 14 ноября 2018

Я хотел бы узнать, что ошибка из моего кода или из моего API.

Это мой API CLASS:

      import retrofit2.Call;
      import retrofit2.http.Body;
      import retrofit2.http.POST;

      public interface Api {


          @POST("/api/Database/NewLocation")
          Call<MapDetails> mapDetailLocation(@Body MapDetails mapDetails);

          @POST("/api/Registration/RegisterDevice")
          Call<RegisterDetails> registerDetails(@Body RegisterDetails                     
           registerAllDetails);

      }

SETTER CLASS:

      import com.google.gson.annotations.SerializedName;

      public class MapDetails {
          @SerializedName("SerialNumber")
          private String serialNumber;
          @SerializedName("Coordinate1")
          private String coordinate1;
          @SerializedName("Coordinate2")
          private String coordinate2;
          @SerializedName("DateTime")
          private String dateTime;
          @SerializedName("Speed")
          private String speed;
          @SerializedName("Port")
          private Integer Port;



          public MapDetails(String serialNumber, String coordinate1, String           
           coordinate2,
                            String dateTime, String speed, Integer port) {
              this.serialNumber = serialNumber;
              this.coordinate1 = coordinate1;
              this.coordinate2 = coordinate2;
              this.dateTime = dateTime;
              this.speed = speed;
              Port = port;
          }

          public String getSerialNumber() {
              return serialNumber;
          }

          public void setSerialNumber(String serialNumber) {
              this.serialNumber = serialNumber;
          }

          public String getCoordinate1() {
              return coordinate1;
          }

          public void setCoordinate1(String coordinate1) {
              this.coordinate1 = coordinate1;
          }

          public String getCoordinate2() {
              return coordinate2;
          }

          public void setCoordinate2(String coordinate2) {
              this.coordinate2 = coordinate2;
          }

          public String getDateTime() {
              return dateTime;
          }

          public void setDateTime(String dateTime) {
              this.dateTime = dateTime;
          }

          public String getSpeed() {
              return speed;
          }

          public void setSpeed(String speed) {
              this.speed = speed;
          }

          public Integer getPort() {
              return Port;
          }

                    public void setPort(Integer port) {
              Port = port;
          }
      }

Класс активности:

                    MapDetails mapDetails = new MapDetails("1807200005", 
                    lat,lon, currentDateTimeString, "0", 9090);
                    setLocation(mapDetails);



                   private void setLocation(MapDetails mapDetails) {
                      initializeRetrofit(mapDetails);
                     }

                private void initializeRetrofit(MapDetails mapDetails) {
                    Retrofit.Builder builder = new Retrofit.Builder()
                            .baseUrl("http://undefine.apisecure.data[![enter image description here][1]][1]")
                      .addConverterFactory(GsonConverterFactory.create());

                    Retrofit retrofit = builder.build();

                    Api locate = retrofit.create(Api.class);

                    SetMapLocationApiCaller(locate, mapDetails);


                }

                private void SetMapLocationApiCaller(Api locate, MapDetails 
                mapDetails) {

                    Call<MapDetails> call =                      
                    locate.mapDetailLocation(mapDetails);
                    executeCallAsynchronously(call);
                }

                private void executeCallAsynchronously(Call call) {
                    call.enqueue(new Callback<MapDetails>() {
                        @Override
                        public void onResponse(Call<MapDetails> call, 
                         Response<MapDetails> response) {

                            Snackbar.make(view,""+ response, 
                                    Snackbar.LENGTH_INDEFINITE)
                                    .setAction("Action", null).show();
                        }

                        @Override
                        public void onFailure(Call call, Throwable t) {
                            Snackbar.make(view, ""+t.getMessage(), 
                                      Snackbar.LENGTH_INDEFINITE)
                                    .setAction("Action", null).show();

                        }
                    });


                }

В моем приложении это ответ моего приложения: enter image description here

, но он не добавлен в мой sql.Но если я использую insomia, он отправит созданные мной данные в базу данных. enter image description here

эти данные были вставлены через insomia, а не на мобильный.enter image description here

1 Ответ

0 голосов
/ 14 ноября 2018

Вы почти достигли решения.Но вы допустили небольшую ошибку при передаче параметров в запрос API.

Как видно из скриншота приложения Insomia, этот API требует JSONArray в качестве параметра, но вы отправляете JSONObject.

Пример параметра JSON

[
    {
        "SerialNumber" : "1234",
        "Coordinate1" : "12.7845874",
        "Coordinate2" : "76.4584578",
        "DateTime" : "2018-11-14 08:45:00",
        "Speed" : "0",
        "Port" : 9090
    }
]

В соответствии с приведенной выше структурой JSON вам необходимо изменить класс Api.java на что-то вроде этого:

import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.POST;

import java.util.List;  // add import

public interface Api {

    @POST("/api/Database/NewLocation")
    Call < MapDetails > mapDetailLocation(@Body List<MapDetails> mapDetails);

                                            //  ^^^^ changes here

    @POST("/api/Registration/RegisterDevice")
    Call < RegisterDetails > registerDetails(@Body RegisterDetails registerAllDetails);

}

Добавить List<MapDetails> к mapDetailLocation() методупараметр.

А в операции или фрагменте используйте вышеуказанный метод следующим образом:

//......
// part of the code

MapDetails mapDetails = new MapDetails("1807200005", lat, lon, currentDateTimeString, "0", 9090);

List<MapDetails> data = new ArrayList<>();

data.add(mapDetails);

Retrofit.Builder builder = new Retrofit.Builder()
                            .baseUrl("<BASE_URL>")  // change base URL
                            .addConverterFactory(GsonConverterFactory.create());

Retrofit retrofit = builder.build();

Api locate = retrofit.create(Api.class);

Call<MapDetails> call = locate.mapDetailLocation(data);     // NOTICE THE CHANGES IN PARAMETER

call.enqueue(new Callback<MapDetails>() {
    @Override
    public void onResponse(Call<MapDetails> call, Response<MapDetails> response) {

        // do whatever you want

    }

    @Override
    public void onFailure(Call call, Throwable t) {

        // log the error message 

    }
});

Примечание. Пожалуйста, измените базовый URL в соответствии с вашими требованиями.

Редактировать:

Изменить параметры метода в Activity с MapDetails на List<MapDetails>

// prepare data

MapDetails data = new MapDetails("1807200005", lat, lon, currentDateTimeString, "0", 9090);

// add it to ArrayList

List<MapDetails> mapDetails = new ArrayList<>();

mapDetails.add(data);

// pass it as an argument

private void setLocation(List<MapDetails> mapDetails) {
    initializeRetrofit(mapDetails);
}

Изменить параметр метода в initializeRetrofit()

private void initializeRetrofit(List<MapDetails> mapDetails) {
    Retrofit.Builder builder = new Retrofit.Builder()
                            .baseUrl("<BASE_URL>")  // change base URL
                            .addConverterFactory(GsonConverterFactory.create());

    Retrofit retrofit = builder.build();

    Api locate = retrofit.create(Api.class);

    SetMapLocationApiCaller(locate, mapDetails);

}

Снова изменить методпараметр

private void SetMapLocationApiCaller(Api locate, List<MapDetails> mapDetails) {
    Call<MapDetails> call = locate.mapDetailLocation(mapDetails);
    executeCallAsynchronously(call);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...