我第一次使用Retrofit2并且有一些问题。
这是用于调用REST API的代码段
//building retrofit object
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://192.168.0.71:9000/api/uniapp/")
.addConverterFactory(GsonConverterFactory.create())
.addConverterFactory(ScalarsConverterFactory.create())
.build();
APIService service = retrofit.create(APIService.class);
//defining the call
Call<String> call = service.refreshAppMetaConfig("0");
//calling the api
call.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
//displaying the message from the response as toast
System.out.println("Uniapp :"+response);
}
@Override
public void onFailure(Call<String> call, Throwable t) {
System.out.println("Uniapp :"+t.getMessage());
}
});
这是APIService类:
public interface APIService {
//The register call
@FormUrlEncoded
@POST("appmetaconfigjson")
Call<String> refreshAppMetaConfig(@Field("versionId") String versionId);
}
我正在使用Play框架来创建REST API。我收到内部服务器错误。 API无法读取JSON请求。但是如果我通过Postman命中API,它会返回响应。有什么建议?
我添加了邮递员请求屏幕截图。
正如我从Postman的截图中看到的那样,您将JSON主体发送到REST API。当您在邮差中选择体型为raw
- application/json
时,它会自动包含
Content-Type:application/json
作为标题。因此,请求在Postman中成功。
现在,为了使其在Android应用程序中成功执行请求,您需要使用发送到REST API的请求设置标头。
在APIService
界面做以下更改。
import retrofit2.http.Body;
import okhttp3.ResponseBody;
import java.util.Map;
public interface APIService {
//The register call
// @FormUrlEncoded <==== comment or remove this line
@Headers({
"Content-Type:application/json"
})
@POST("appmetaconfigjson")
Call<ResponseBody> refreshAppMetaConfig(@Body Map<String, String> versionId);
}
@FormUrlEncoded
注释,因为我们发送的是JSON而不是FormUrlEncoded数据。@Headers()
添加Content-Type:application/json
注释@Body Map<String, String> versionId
。当您请求API时,@Body
注释将Map
(HashMap)数据转换(序列化)为JSON正文。String
更改为ResponseBody
。使用上面修改的方法如下
// code...
//defining the call
// create parameter with HashMap
Map<String, String> params = new HashMap<>();
params.put("versionId", "0");
Call<ResponseBody> call = service.refreshAppMetaConfig(params);
//calling the api
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
//displaying the message from the response as toast
// convert ResponseBody data to String
String data = response.body().string();
System.out.println("Uniapp : " + data);
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
System.out.println("Uniapp : " + t.getMessage());
}
});
在这里你还需要将参数从Call<String>
更改为Call<ResponseBody>
。并使用onResponse()
转换response.body().string();
方法内的响应。