我读到代码为 304(未修改)的响应不应包含正文。那么,OkHttp 是否从缓存中获取正文,还是我们应该显式获取它,即
if reponseCode == 304:
body = <getDataFromCache>
Run Code Online (Sandbox Code Playgroud)
对于后一种情况,如何从缓存中获取数据呢?
OkHttpClient client = new OkHttpClient();
File cacheDirectory = new File(context.getCacheDir(), "responses");
Cache cache = null;
try {
cache = new Cache(cacheDirectory, 10 * 1024 * 1024); // 10M
client.setCache(cache);
} catch (IOException e) {
Log.e("AbstractFeedIntentService", "Could not create http cache", e);
}
Request.Builder requestBuilder = new Request.Builder();
requestBuilder.url(url);
Request request = requestBuilder.build();
Call call = client.newCall(request);
Response response = call.execute();
// if code==304, does the response contain the data …Run Code Online (Sandbox Code Playgroud) 我在这里写了一段代码:
public class Wizard1 extends GuidedStepFragment implements Callback {
private boolean sendPhoneNumber(String userPhoneNumber) {
OkHttpClient client = new OkHttpClient();
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("request_magic_code", Urls.REQUEST_MAGIC_CODE)
.build();
Request request = new Request.Builder()
.url(Urls.HOST + Urls.SEND_PHONE_NUMBER)
.post(requestBody)
.build();
client.newCall(request).enqueue(this);
return success;
}
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
ResponseBody myResponse = response.body();
Log.d("SS", response.body().string());
Log.d("SS", response.body().string());
if (myResponse != null) {
success …Run Code Online (Sandbox Code Playgroud) 我需要从 cookie 添加一些授权信息以响应下一个请求。
它适用于邮递员 - 我提出授权请求,然后是第二个请求,效果很好。但是如果我删除 cookie - 第二个请求返回错误,我必须再次进行授权请求。
但是在我的应用程序中,第二个请求总是返回相同的错误。我试图通过使用拦截器找到所需的 cookie,但我没有找到它
val client = OkHttpClient.Builder()
.addInterceptor(OAuthInterceptor())
private class OAuthInterceptor : Interceptor {
override fun intercept(chain: Chain): Response {
val request = chain.request()
com.app.logic.toLog("${chain.proceed(request).header("set-cookie")} ") // it's not that cookie what I looking for
val headers = chain.proceed(request).headers()
headers.names().forEach {
val s = headers.get(it)
com.app.logic.toLog("$it -> $s")
}
return chain + (Session.authConsumer?.let { consumer ->
consumer.sign(request).unwrap() as Request
} ?: request)
}
}
Run Code Online (Sandbox Code Playgroud)
有人知道我还能尝试什么吗?
几天前将我的 Android Studio 更新到最新版本后,我在改造和 okhttp 方面遇到了问题。在此之前,我的代码可以正常工作,没有任何问题。这是改造客户端的类,它崩溃了
public class ApiClient {
public static final String BASE_URL = "myapiurl";
private static Retrofit mRetrofit = null;
public static Retrofit getClient() {
if (mRetrofit ==null) {
Gson gson = new GsonBuilder()
.setLenient()
.setDateFormat("yyyy-MM-dd'T'HH:mm:ss")
.create();
mRetrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
}
return mRetrofit;
}
Run Code Online (Sandbox Code Playgroud)
}
我得到的错误非常普遍,我不知道下一步该去哪里。
2019-03-03 07:15:15.774 21769-21769/com.instreamwater.app E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.instreamwater.app, PID: 21769
java.lang.BootstrapMethodError: Exception from call site #0 bootstrap method
at okhttp3.internal.Util.<clinit>(Unknown Source:111)
at okhttp3.internal.Util.skipLeadingAsciiWhitespace(Unknown Source:0)
at okhttp3.HttpUrl$Builder.parse(Unknown …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用OkHttp从 Android 应用程序中的网络服务器下载文件。使用 Android Studio(API 级别 28)创建新项目后,我添加了一个按钮,并将 ImageView 添加到我的活动中。这个想法是当我按下按钮并在屏幕上显示时下载图像。
我正在使用最新版本的 OkHttp,3.14.0。
我添加<uses-permission android:name="android.permission.INTERNET"/>到 AndroidManifest.xml 文件中。
我尝试完全按照示例中的描述使用 OkHttpClient 。这是我的代码的样子:
public class MainActivity extends AppCompatActivity {
... // onCreate method
public void btnClicked(View view) {
new DownloadImageAsyncTask().execute("https://link.to/image.jpg");
}
public class DownloadImageAsyncTask extends AsyncTask<String, Void, Bitmap> {
OkHttpClient client = new OkHttpClient();
... // override doInBackground()
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行应用程序并按下按钮时,该btnClicked()方法被执行并且应用程序崩溃。OkHttpClient()无论我是将它作为DownloadImageAsyncTask类中的一个字段,作为方法的局部变量doInBackground()还是作为类中的一个字段,调用时都会发生错误ManActivity。
我还尝试使用 Builder ( new OkHttpClient.Builder().build()) 来初始化对象,但结果相同。
这是堆栈跟踪: …
我需要从我的 android 项目向端点发出 post 请求。我正在使用 Kotlin。我是否需要为此创建一个单独的 OKHttpClient 类。
我有一个 java 8 项目,我需要创建一个 API 后调用。该项目使用 gradle 。我认为OKHTTP是一个很好的解决方案,但是我不知道在build gradle类中放什么在某些网站中只需要放入compile 'com.squareup.okhttp:okhttp:2.5.0'
OK Http站点他们说
compileKotlin {
kotlinOptions {
jvmTarget = "1.8"
}
}
compileTestKotlin {
kotlinOptions {
jvmTarget = "1.8"
}
}
compileJava {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
Run Code Online (Sandbox Code Playgroud)
我不需要android,只想发布到服务器并在java应用程序中获得响应(我创建了发布数据的方法)。(我会在selenium中使用它,项目是纯java的)我发现的所有例子都是3.x版本,所以我想创建对版本3的依赖。(我不知道版本3有什么区别到第 4 版,但想要发布 json/ 应用程序并获得响应)
我是 gradle 的新手,如果我需要的不仅仅是将 line\lines 添加到 gradle build,有人可以澄清一下吗?
有人可以请逐步建议什么是唯一需要放入 gradle build 问候的东西
我尝试在应用程序中禁用 SSL 验证,但应用程序在某些设备的 Android 10 中崩溃。我在我的应用程序中使用了 Retrofit 和 Okhttp。下面是我如何尝试在我的应用程序中禁用 SSL 验证。我没有从互联网上找到任何解决方案。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val trustAllCerts = arrayOf<TrustManager>(
object : X509TrustManager {
override fun checkClientTrusted(
chain: Array<out X509Certificate>?,
authType: String?
) {
}
override fun checkServerTrusted(
chain: Array<out X509Certificate>?,
authType: String?
) {
}
override fun getAcceptedIssuers(): Array<X509Certificate>? {
return null
}
}
)
val sslContext = SSLContext.getInstance("SSL")
sslContext.init(null, trustAllCerts, SecureRandom())
val sslSocketFactory = sslContext.socketFactory
val okhttp = OkHttpClient.Builder()
.sslSocketFactory(sslSocketFactory, trustAllCerts[0] …Run Code Online (Sandbox Code Playgroud) 我知道这就是拦截器的工作方式,来自应用程序的请求通过 OkHttp 核心,通过改造包装器和 OkHttpp 核心调用来发出实际的网络请求,并通过改造包装器对应用程序拦截器响应进行网络响应。
有没有办法避免从应用程序拦截器调用实际请求,例如,在应用程序拦截器的某些场景中,检查请求 URL 是否是某个字符串,然后,在这种情况下,不要调用实际的网络请求并直接从应用程序拦截器返回硬编码的响应?
Java 是一种美丽的语言,据说也非常高效。来自使用 Python 的背景,我想看看这两种语言之间的区别 - 从一开始我就对 Java 基于 OOP 的语法的明确性和清晰性印象深刻。但是,我也想测试一下语言之间的性能差异。
我首先尝试通过计算速度测试两种语言之间的性能差异。为此,我用每种语言编写了一些代码——程序试图计算一个数学问题,并且会迭代很多次。我不会在这里添加这段代码,但我会说结果——Python 几乎比 Java 慢 2 倍(按时间衡量)。有趣,但这是意料之中的。毕竟,我想尝试使用 Java 的全部原因是因为有很多人吹嘘计算速度。
之后,我进行了第二次测试——建立到网站的 HTTP 连接,以便下载网页。对于这个测试,我编写了另一个测试程序,它的功能与上一个测试相同,只是它不是计算数学方程,而是使用 HTTP 库下载网页。
我最终用 Python 编写了以下脚本。它非常简单,它在下载网页时迭代 10 次,然后打印平均值。
from requests import get
from time import time
# Start the timer
start = time()
# Loop 10 times
for i in range(10):
# Execute GET request
get("https://httpbin.org/get")
# Stop the timer
stop = time()
# Calculate and print average
avg = (stop - start) / 10
print(avg)
# Prints 0.5385, on …Run Code Online (Sandbox Code Playgroud) okhttp ×10
android ×8
java ×3
retrofit2 ×3
kotlin ×2
okhttp3 ×2
build.gradle ×1
caching ×1
cookies ×1
gradle ×1
http ×1
interceptor ×1
leanback ×1
networking ×1
retrofit ×1