Передача одного параметра, ссылающегося на другой, - доступ к методу REST из Android - PullRequest
0 голосов
/ 21 сентября 2018

В моем приложении для Android я подключаюсь через REST к приложению Delphi на сервере Firebird с помощью Retrofit.Существует метод REST "SelectSQL", который принимает два параметра: String и TJSONObject.Например:

select name from employee where employee_id=:id

{"id":10001}

Это часть интерфейса, где я объявляю методы: я использовал string и JSONObject.

 @POST("datasnap/rest/TstBaseMethods/SelectSQL/{param,param2}")
Call<Logowanie> selectSQL(@Header("Authorization") String credentials, @Query("param") String param, @Query("param2") JSONObject param2 );

В моем MainActivity.java я использую:

 Gson gson = new GsonBuilder()
            .setLenient()
            .create();

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create(gson))
            .build();

    StreamREST gerritAPI = retrofit.create(StreamREST.class);

    String dane = Credentials.basic("admin","admin");
    JSONObject obj = new JSONObject();
    try {
        obj.put("NAGL",11101);
        String dd = obj.toString();
        Call<Logowanie> sql = gerritAPI.selectSQL(dane,"select n.datadok from nagl n where n.id_nagl=:NAGL",obj);
        sql.enqueue(new Callback<Logowanie>() {
            @Override
            public void onResponse(Call<Logowanie> call, Response<Logowanie> response) {
                if(response.isSuccessful()) {
                    Logowanie log = response.body();
                    String result = log.result[0];
                    intent.putExtra(EXTRA_MESSAGE,generujWynik(log));
                    startActivity(intent);
                } else {
                    System.out.println(response.toString());
                }
            }

            @Override
            public void onFailure(Call<Logowanie> call, Throwable t) {
                System.out.println(t.getMessage() );
            }
        });
    } catch (JSONException e) {
        e.printStackTrace();
    }

Проблема в том, что Retrofit неправильно кодирует второй параметр.Когда я запускаю приложение, я получаю сообщение о плохом втором параметре, и URL выглядит так:

http://192.168.94.155:9000/datasnap/rest/TstBaseMethods/SelectSQL/%7Bparam,param2%7D?param=select%20n.datadok%20from%20nagl%20n%20where%20n.id_nagl%3D:NAGL&param2={%22NAGL%22:11101}

Вы можете увидеть: "param2 = {% 22NAGL% 22: 11101}" гдеparam2 выглядит так:

{"NAGL":11101} 

Скобки и "" не кодируются.Где моя ошибка?Я признаю, что это мои первые шаги с Android и REST со Stackoverflow, но я уже сделал основы: я запустил базовый метод REST, и он сработал.Теперь это проблема для меня.

Если я не включил важные части своего кода, просто скажите мне, и я сделаю это.

Я могу добавить, что речь идет о DataSnap REST от Embarcadero.

1 Ответ

0 голосов
/ 23 сентября 2018

Проблема решена.Оказалось, что мне пришлось использовать аннотацию @Body Retrofit, так как этот параметр должен идти в теле запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...