相关疑难解决方法(0)

如何在Retrofit请求的主体中发布原始整个JSON?

这个问题可能以前曾被问过,但没有得到明确答复.如何在Retrofit请求的主体内发布原始整个JSON?

看到类似的问题在这里.或者这个答案是否正确,它必须是url编码形式并作为字段传递?我真的希望不会,因为我所连接的服务只是期待帖子正文中的原始JSON.它们未设置为查找JSON数据的特定字段.

我只是想与澄清这一restperts一劳永逸.一个人回答不使用Retrofit.另一个不确定语法.另一个人认为可以这样做,但只有当它的形式url编码并放在一个字段中时(在我的情况下这是不可接受的).不,我无法为我的Android客户端重新编码所有服务.是的,在主要项目中发布原始JSON而不是将JSON内容作为字段属性值传递是很常见的.让我们做对了,继续前进吧.有人可以指向显示如何完成此操作的文档或示例吗?或者提供可以/不应该完成的有效理由.

更新:我可以100%确定地说一件事.你可以在谷歌的排球中做到这一点.它是内置的.我们可以在Retrofit中做到这一点吗?

rest android http-post retrofit android-json

259
推荐指数
15
解决办法
29万
查看次数

Retrofit和OkHttpClient,在失败方法中捕获连接超时

我有以下设置:

final OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.setReadTimeout(5, TimeUnit.SECONDS);
okHttpClient.setConnectTimeout(5, TimeUnit.SECONDS);

RestAdapter.Builder builder = new RestAdapter.Builder()
        .setEndpoint(ROOT)
        .setClient(new OkClient(okHttpClient))
        .setLogLevel(RestAdapter.LogLevel.FULL);
Run Code Online (Sandbox Code Playgroud)

我试图处理我的服务器关闭和用户获得连接超时异常的情况,这是我的日志记录:

java.net.SocketTimeoutException: failed to connect to /192.168.0.53 (port 3000) after 5000ms
Run Code Online (Sandbox Code Playgroud)

完整日志记录:http://pastebin.com/gscCGb7x

有没有办法将其转换为改装故障方法,以便我可以在那里处理它?

提前致谢!

android connection-timeout retrofit okhttp

37
推荐指数
4
解决办法
6万
查看次数

改造2.0b2:如何从响应中获取InputStream?

我正在使用Retrofit 2.0b2.得到回复后,我尝试通过以下方式从响应中获取InputStream:

Response<JsonNode> response = call.execute();
InputStream is = response.raw().body().byteStream();
Run Code Online (Sandbox Code Playgroud)

但应用程序继续投掷:

java.lang.IllegalStateException: Cannot read raw response body of a converted body.
        at retrofit.OkHttpCall$NoContentResponseBody.source(OkHttpCall.java:184)
        at com.squareup.okhttp.ResponseBody.byteStream(ResponseBody.java:43)
        at ...
Run Code Online (Sandbox Code Playgroud)

尽管响应正确返回.我在这做错了什么?

java android retrofit okhttp

13
推荐指数
1
解决办法
8396
查看次数

在Retrofit回调中访问原始响应主体

改装版本:2.1.0
OkHttp版本:3.4.1

onResponse我的Retrofit Callback实现方法中,我有以下逻辑:

@Override
public void onResponse(Call<BaseResponseBody<T>> call, Response<BaseResponseBody<T>> response) {
  if (response != null && response.isSuccessful() && response.body() != null && response.body().containsValidSuccess()) {
    // Perform actions using response.body().getValue().
  } else {
    // If containsValidSuccess returns false, show a dialog that includes the raw JSON response body.
  }
}
Run Code Online (Sandbox Code Playgroud)

BaseResponseBody是我自己的类型(与OkHttp无关ResponseBody)包装泛型类型T extends Validatable,其中Validatable是一个接口,isValid用于公开用于确认反序列化响应满足给定约束的方法.

如果我收到表面上成功的响应(HTTP代码2XX,非空响应主体等),但其反序列化主体未通过此验证步骤(即containsValidSuccess返回false),我想提供一个对话框,其消息包括的原料(反序列化预)响应体.但是,我似乎无法通过Retrofit Response类型访问此原始响应正文.

我读过其他似乎暗示Interceptor可能更适合我需求的页面.我熟悉拦截器,并在我的应用程序中使用它们进行其他调用操作,但是我没有确切地知道如何将拦截器中的信息传递给最终Callback.onResponse方法以呈现对话框.

我在正确的道路上吗?我是否遗漏了Retrofit API中的一些明显内容?我怎样才能达到既定目标?谢谢!

android retrofit okhttp retrofit2 okhttp3

8
推荐指数
1
解决办法
3131
查看次数