没有通过 REST 调用接收 json 数据
Posted
技术标签:
【中文标题】没有通过 REST 调用接收 json 数据【英文标题】:Not receiving json data with a REST call 【发布时间】:2020-09-05 10:56:33 【问题描述】:我正在尝试使用改造来使用我自己的 REST 调用。我关于它为什么不起作用的唯一线索是它说信息的类型是“text/html”,即使我确定它是 json。话虽如此,我还没有找到任何解决我问题的答案。
有效载荷:
[
"user_id": "32",
"username": "Marko",
"last_activity": "2020-04-26 20:44:00",
"user_image": "slika2"
,
"user_id": "33",
"username": "dejan",
"last_activity": "2020-04-26 20:44:00",
"user_image": "slika3"
]
我的聊天课:
public class Chat
@SerializedName("user_id")
private String userId;
private String username;
@SerializedName("last_activity")
private String lastActivity;
@SerializedName("user_image")
private String userImage;\
...constructor/getters
API接口:
@FormUrlEncoded
@POST("api_get_all_chats.php")
Call<List<Chat>> getChats(
@Field("id") String id
);
API 客户端:
public static Retrofit getClient()
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.level(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();
retrofit = new Retrofit.Builder()
.baseUrl("http://MYIP/emob%20projekat/api/")
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build();
return retrofit;
以及整个请求:
apiInterface = ApiClient.getClient().create(userApi.class);
Call<List<Chat>> call = apiInterface.getChats(u.getUserInfo().getUserId());
call.enqueue(new Callback<List<Chat>>()
@Override
public void onResponse(Call<List<Chat>> call, Response<List<Chat>> response)
chatList = new ArrayList<>(response.body());
chatAdapter = new ChatAdapter(getApplication().getApplicationContext(), R.layout.user_view, chatList);
listView.setAdapter(chatAdapter);
@Override
public void onFailure(Call<List<Chat>> call, Throwable t)
Toast.makeText(getApplication().getApplicationContext(), "ne valja" , Toast.LENGTH_LONG).show();
);
任何我搞砸的线索都将不胜感激。
【问题讨论】:
尝试在 POSTMAN 中运行相同的请求 我做到了,而且效果很好。 什么是ip?是本地主机还是普通 IP 或公共 IP? 【参考方案1】:当我解码时你的基本网址有空间我得到了
http://MYIP/emob projekat/api/
我建议您放置不编码的基本 URL
【讨论】:
我会更新它,但它不会改变任何东西。我已经在使用同一文件夹中的一个 REST 调用,它可以正常工作。【参考方案2】:您的androidManifest
上的cleartextTrafficPermitted="true"
怎么样。我看到您的代码很好,我认为您的 URL 可能存在http
方案的问题。
【讨论】:
【参考方案3】:您可以尝试在您的 API 接口中使用 Accept:application/json
指定您的客户期望的响应:
@FormUrlEncoded
@Headers("Accept:application/json")
@POST("api_get_all_chats.php")
Call<List<Chat>> getChats(
@Field("id") String id
);
在您的 API 客户端中使用new Retrofit.Builder().addHeader("Accept","application/json");
。
square/retrofit 中的 issue 与您的非常相似(只是相反,因为在问题中它是服务器不接受 text/html
而在您的情况下它似乎是您的客户端。也许,因为在这个问题中,您也使用了gson,它无法解析text/html
风味的响应)
【讨论】:
【参考方案4】:你需要这样的拦截器。
public class CustomInterceptor extends Interceptor
@override
public Response intercept(Interceptor.Chain chain)
return chain.proceed(chain.request().newBuilder().addHeader("Content-Type", "application/json").addHeader("Accept", "application/json").build())
【讨论】:
【参考方案5】:首先尝试记录请求,查看发送的确切内容,包括标头、url、正文和响应:https://github.com/square/okhttp/tree/master/okhttp-logging-interceptor
其次,你确定你必须发出一个 POST 请求,一个 GET 似乎更好吗?
【讨论】:
以上是关于没有通过 REST 调用接收 json 数据的主要内容,如果未能解决你的问题,请参考以下文章
使用 REST API 从 Web 服务接收 JSON 数据
PostgreSql 或 MongoDb 用于从 REST API 接收的 JSON 数据
silverlight调用WebService传递json接收绑定数据
通过FeignClient接收shaded的javabean的JSON序列化