我第一次使用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请求。但是,如果我通过邮递员访问API,它将返回响应。有什么建议吗?
我已经添加了邮递员请求屏幕截图。
答案 0 :(得分:1)
从邮递员的屏幕截图中可以看到,您正在将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
注释。@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();
方法内转换响应。