相关疑难解决方法(0)

从OKHTTP下载二进制文件

我在我的Android应用程序中使用OKHTTP客户端进行网络连接.

示例显示如何上载二进制文件.我想知道如何使用OKHTTP客户端获取二进制文件下载的输入流.

以下是该示例的列表:

public class InputStreamRequestBody extends RequestBody {

    private InputStream inputStream;
    private MediaType mediaType;

    public static RequestBody create(final MediaType mediaType, 
            final InputStream inputStream) {
        return new InputStreamRequestBody(inputStream, mediaType);
    }

    private InputStreamRequestBody(InputStream inputStream, MediaType mediaType) {
        this.inputStream = inputStream;
        this.mediaType = mediaType;
    }

    @Override
    public MediaType contentType() {
        return mediaType;
    }

    @Override
    public long contentLength() {
        try {
            return inputStream.available();
        } catch (IOException e) {
            return 0;
        }
    }

    @Override
    public void writeTo(BufferedSink sink) throws IOException {
        Source source …
Run Code Online (Sandbox Code Playgroud)

android inputstream bufferedinputstream okhttp

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

收到改造的不完全答复

我正在使用翻新版本2.6.1通过网络发出http请求。我期望的JSON长42466个字符。但是,我只收到4073个字符,并且API在Web浏览器和邮递员上正常工作。

因此,我添加了自定义okhttp客户端并增加了超时时间,但这对我没有帮助。

private var okHttpClient: OkHttpClient = OkHttpClient().newBuilder()
    .connectTimeout(10, TimeUnit.SECONDS)
    .readTimeout(10, TimeUnit.SECONDS)
    .writeTimeout(10, TimeUnit.SECONDS)
    .build()
Run Code Online (Sandbox Code Playgroud)

然后,我尝试添加一个日志记录拦截器,发现okhttp在拦截器日志中以块的形式接收了我想要的响应。

private val httpInterceptor: HttpLoggingInterceptor = HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)
private var okHttpClient: OkHttpClient = OkHttpClient().newBuilder()
    .connectTimeout(10, TimeUnit.SECONDS)
    .readTimeout(10, TimeUnit.SECONDS)
    .writeTimeout(10, TimeUnit.SECONDS)
    .addInterceptor(httpInterceptor)
    .build()
Run Code Online (Sandbox Code Playgroud)

最后,我将http客户端和拦截器分配给改造生成器,这就是它的外观

private val centralRetrofit = Retrofit.Builder().baseUrl("https://www.********.com/")
    .addConverterFactory(ScalarsConverterFactory.create())
    .client(okHttpClient)
    .build()
    .create(MusicAccess::class.java)
Run Code Online (Sandbox Code Playgroud)

因此,我认为使用发布请求将对我有所帮助,而不是尝试以字符串格式获取所有响应以检查响应

@Headers("Content-Type: text/html; charset=UTF-8")
@POST("**********")
fun getMusic(): Call<String>
Run Code Online (Sandbox Code Playgroud)

但是在我认为http响应将具有大小限制并使用阅读器通过以下方式从url访问json之后,也没有得出结论。

val client = OkHttpClient()
val request = Request.Builder().url("********")
    .addHeader("Content-Type", "application/json")
    .build()
val response = client.newCall(request).execute()
val input = response.body()?.byteStream()
val reader = BufferedReader(InputStreamReader(input)) …
Run Code Online (Sandbox Code Playgroud)

android retrofit okhttp retrofit2

6
推荐指数
1
解决办法
209
查看次数