将一个参数引用传递给另一个参数 - 从Android访问REST方法



在我的Android应用程序中,我使用Retrofit通过REST连接到Firebird服务器上的Delphi应用程序。 有 REST 方法 "SelectSQL" 它有两个参数:StringTJSONObject。 例如:

select name from employee where employee_id=:id
{"id":10001}

这是我声明方法的接口的一部分:我使用了字符串和JSONObject。

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

在我的主活动中.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();
}

问题是改造没有正确编码第二个参数。当我启动应用程序时,我收到有关错误的第二个参数的消息,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方法并且它有效。现在对我来说是问题。

如果我没有包含代码的重要部分,请告诉我,我会这样做。

我可以补充一点,这是关于Embarcadero的DataSnap REST。

问题解决了。事实证明,我必须使用@Body Retrofit 注释,因为此参数应该放在请求的正文中。

相关内容

最新更新