如何在OkHttp 3中跟踪上传的进度我可以找到v2但不是v3的答案,就像这样
来自OkHttp配方的示例Multipart请求
private static final String IMGUR_CLIENT_ID = "...";
private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
private final OkHttpClient client = new OkHttpClient();
public void run() throws Exception {
// Use the imgur image upload API as documented at https://api.imgur.com/endpoints/image
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("title", "Square Logo")
.addFormDataPart("image", "logo-square.png",
RequestBody.create(MEDIA_TYPE_PNG, new File("website/static/logo-square.png")))
.build();
Request request = new Request.Builder()
.header("Authorization", "Client-ID " + IMGUR_CLIENT_ID)
.url("https://api.imgur.com/3/image")
.post(requestBody)
.build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) throw new IOException("Unexpected code …Run Code Online (Sandbox Code Playgroud) 问题:如何向OkHTTP添加授权代理.
我知道OkHTTP的构建器确实支持代理,尽管我很难设置代理.
/**
* Given a Url and a base64 encoded password return the contents of a website.
* @param urlString
* @param password
* @return JSON
*/
public String getURLJson(String urlString, String password) {
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.build();
Request request = new Request.Builder()
.url(urlString)
.get()
.addHeader("authorization", "Basic " + password)
.addHeader("cache-control", "no-cache")
.build();
Response response = null;
try {
response = client.newCall(request).execute();
String string = response.body().string(); …Run Code Online (Sandbox Code Playgroud) 所以我开始使用Okhttp 3,网上的大多数例子都是关于旧版本的
我需要在OkHttp客户端请求中添加一个cookie,如何用OkHttp 3完成?
在我的情况下,我只是想静态地将它添加到客户端调用而不从服务器接收它
有没有办法获取请求的最终URL?我知道我可以自己禁用重定向,但有没有办法获取我正在加载的当前URL?就像,如果我要求a.com并被重定向到b.com,有没有办法获得url b.com的名称?
因此,我正在使用一个明确定义的API,旨在不返回有效负载主体DELETE和PUT操作.
这在Rx 0.X和Rx 1.x中是可接受的.现在我正在更新到Rx 2并且存在一个存在的危机,我应该如何处理空值.内容长度和正文当然是null,导致:
java.lang.NullPointerException: Null is not a valid element
at io.reactivex.internal.queue.SpscLinkedArrayQueue.offer(SpscLinkedArrayQueue.java:68)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.onNext(ObservableObserveOn.java:116)
at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeOnObserver.onNext(ObservableSubscribeOn.java:63)
Run Code Online (Sandbox Code Playgroud)
在doOnNext中.
我见过很多人的建议Optional<>但是我也需要支持Java7以用于用例原因.我尝试了后端移植,但我无法让它工作.我也不想膨胀并为他们的版本导入Guava库.
我也注意到flatMap也可以帮我处理这个与地图相反的问题,而我正在阅读这些差异.
目前我有一个非常粗糙的OkHttp3拦截器,它将检查状态,检查有效负载是否为空,并添加错误的虚拟内容.
我也试过添加转换工厂.
任何人都可以提供建议并指导我正确的道路是什么?当然,API可以改变,但204不应该因为它的定义为HTTP状态代码而具有有效载荷.
compile('com.squareup.retrofit2:retrofit:2.1.0') {
exclude module: 'okhttp'
}
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
compile 'com.squareup.okhttp3:okhttp:3.5.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'
compile 'io.reactivex.rxjava2:rxjava:2.0.5'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.trello.rxlifecycle2:rxlifecycle:2.0.1'
compile 'com.trello.rxlifecycle2:rxlifecycle-components:2.0.1'
Run Code Online (Sandbox Code Playgroud) 我有一个处理一些身份验证的拦截器.如果身份验证失败,则抛出和异常.根据我可以发现抛出异常应该导致onFailure在我处理异常的地方被调用.不幸的是,这不会发生,应用程序完全崩溃.我相信我一定会错过一些东西,但我似乎无法弄明白.希望有人在这里可以帮助:)
代码和堆栈跟踪如下:
val client = OkHttpClient.Builder()
// Add interceptor that throws
.addInterceptor { chain ->
throw Exception("test")
}
.build()
retrofit = Retrofit.Builder()
.baseUrl(baseURL)
.client(client)
.build()
api = retrofit.create(ApiInterface::class.java)
// Create api call...
apicall.enqueue(object : Callback<T> {
override fun onResponse(call: Call<T>?, response: retrofit2.Response<T>?) {
// ....
}
override fun onFailure(call: Call<T>?, t: Throwable?) {
// Expect to go here to handle the Exception. But the app crashes
}
})
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪:
E/AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher
Process: com.testapp.test.debug, PID: 28891
java.lang.Error: java.lang.Exception: …Run Code Online (Sandbox Code Playgroud) 我正在使用OkHttp通过Android上的套接字发送和接收消息.
创建套接字连接 -
SocketListener listener = new SocketListener();
mOkHttpClient = new OkHttpClient.Builder()
.readTimeout(0, TimeUnit.MILLISECONDS)
.build();
Request request = new Request.Builder()
.url(socketURL)
.build();
mOkHttpClient.newWebSocket(request, listener);
Run Code Online (Sandbox Code Playgroud)
这是用于侦听所有Web套接字事件的SocketListener类 -
public final class SocketListener extends WebSocketListener {
@Override
public void onOpen(WebSocket webSocket, Response response) {
// doing something
isSocketConnected = true;
}
@Override
public void onMessage(WebSocket webSocket, String text) {
// doing something
}
@Override
public void onMessage(WebSocket webSocket, ByteString bytes) {
}
@Override
public void onClosing(WebSocket webSocket, int code, String reason) {
// …Run Code Online (Sandbox Code Playgroud) 首先,我已经阅读了很多关于我的问题的问题,但是它从来没有给我解决方案。以下是一些有关我的问题的阅读问题。
我也阅读了有关我的问题的这篇文章,但它也从未为我提供解决方案。
问题:
我在Web服务应用程序中使用Okhhtp3库。它工作正常,但是当互联网连接速度慢或连接不可靠时,它就卡住了,永远不会超时,也永远不会调用超时异常或失败方法。
这是客户端代码:
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(20, TimeUnit.SECONDS)
.writeTimeout(20, TimeUnit.SECONDS)
.readTimeout(20, TimeUnit.SECONDS)
.retryOnConnectionFailure(false)
.build();
Run Code Online (Sandbox Code Playgroud)
20秒后如何获得超时异常或称为故障方法?
请帮我。谢谢
Android应用程序有三个主机进行身份验证和授权.最终主机是REST API.第一次使用Oauth身份验证和授权过程,它没有问题.
但是,如果用户在登录后杀死应用程序并访问REST API提供的服务,然后再次打开应用程序,则会出现此问题.在这种情况下,身份验证和授权过程不会发生,只有REST API.它导致java.security.cert.CertPathValidatorException 但它在第一次使用时工作(登录然后使用应用程序).
有人可以解释这个异常背后的情况,并且该应用程序有什么问题.如果根据此SO答案忽略认证例外,则此方法有效.
SSLSocketFactory sslSocketFactory = null;
try {
TrustManagerFactory tmf = TrustManagerFactory.getInstance(
TrustManagerFactory.getDefaultAlgorithm());
// Initialise the TMF as you normally would, for example:
try {
tmf.init((KeyStore)null);
} catch(KeyStoreException e) {
e.printStackTrace();
}
TrustManager[] trustManagers = tmf.getTrustManagers();
final X509TrustManager origTrustmanager = (X509TrustManager)trustManagers[0];
// Create a trust manager that does not validate certificate chains
TrustManager[] wrappedTrustManagers = new TrustManager[]{
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return origTrustmanager.getAcceptedIssuers(); …Run Code Online (Sandbox Code Playgroud) 这是我的代码,我在这里调用api,并通过改造为okhttp定义缓存:
public class DemoPresenter {
DemoView vDemoView;
private Context mContext;
public DemoPresenter(Context mcontext, DemoView vDemoView) {
this.vDemoView = vDemoView;
this.mContext = mcontext;
}
public void callAllProduct() {
if (vDemoView != null) {
vDemoView.showProductProgressBar();
}
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.cache(new Cache(mContext.getCacheDir(), 10 * 1024 * 1024)) // 10 MB
.addInterceptor(new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
Request request = chain.request();
if (BasicUtility.isInternet(mContext)) {
request = request.newBuilder().header("Cache-Control", "public, max-age=" + 60).build();
} else {
request = request.newBuilder().header("Cache-Control", …Run Code Online (Sandbox Code Playgroud)