一个用户使用OkHTTP3后如何发送requset?我必须这样做:1)我使用方法OKHttpRequest
发送request1,到服务器;2)服务器用COOKIE发送request1的响应;3)我保存这个COOKIE;4)我用保存的COOKIE发送request2。
我在第4步有个问题。看起来,request2在request1之后发送,在request1保存他的cookie之前。如何化解?我想在请求保存自己的cookie后发送reuest2。
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
progressBar = (ProgressBar) findViewById(R.id.progress_bar);
try
{
// Получаем cookie и авторизируемся
Log.d("TAG", "Вызываем OkHTTPRequest1");
OkHTTPRequest(postUrl, "POST", postData1);
Log.d("TAG", "Вызываем OkHTTPRequest2");
OkHTTPRequest(postUrl2, "PUT", postData2);
int a;
} catch (IOException e)
{
e.printStackTrace();
} catch (JSONException e)
{
e.printStackTrace();
}
}
// Сохраняем cookieFromServer
public void saveCookie(List<Cookie> cookies)
{
for (int i = 0; i < cookies.size(); i++)
{
String str = cookies.get(i).toString();
if (str.indexOf("issa7=") != -1)
{
cookieFromServer.add(cookies.get(i));
Log.d("TAG", "Сохраняем cookie в глобальную переменную ="+ cookies.get(i).toString());
}
}
}
// Создаем клиент OkHTTPRequest и обрабатываем запросы
void OkHTTPRequest(String postUrl, String requestMethodType, String postData) throws IOException, JSONException
{
// Создаем клиент OkHTTPRequest
OkHttpClient client = new OkHttpClient()
.newBuilder()
// Переопределяем методы чтобы можно было сохранять и применять ccokie в запросах
.cookieJar(new CookieJar()
{
@Override
public void saveFromResponse(HttpUrl url, List<Cookie> cookies)
{
saveCookie(cookies);
Log.d("TAG", "Вызываем saveCookie ");
}
@Override
public List<Cookie> loadForRequest(HttpUrl url)
{
Log.d("TAG","Читаем cookie");
return cookieFromServer;
}
})
.build();
Log.d("TAG","Создаем OkHttpClient клиента " + client.toString());
MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
RequestBody body = RequestBody.create(mediaType, postData);
Request request = new Request.Builder()
.url(postUrl)
.method(requestMethodType, body)
.addHeader("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4")
.addHeader("Cache-Control", "max-age=0")
.addHeader("Connection", "keep-alive")
.addHeader("User-Agent", "Mango Mobile Android")
.build();
client.newCall(request).enqueue(new Callback()
{
@Override
public void onFailure(Call call, IOException e)
{
call.cancel();
}
@Override
public void onResponse(Call call, Response response) throws IOException
{
// Получать response.body().string() можно только один раз. Иначе будет ошибка так реализованно.
String html = response.body().string();
//Log.d("TAG", "Код сайта "+ html);
Document doc = Jsoup.parse(html);
// Копируем содержание response.body()
setDoc(doc);
parseResult(bids);
// Чтобы обращаться к компанентам из MainActivity нужно использовать runOnUiThread
MainActivity.this.runOnUiThread(new Runnable()
{
@Override
public void run()
{
// Отключаем progressBar
progressBar.setVisibility(View.GONE);
// Устанавливаем адаптер
adapter = new MyRecyclerViewAdapter(MainActivity.this, feedsList);
mRecyclerView.setAdapter(adapter);
}
});
}
});
}
// Сохраняем Document код страницы
void setDoc(Document doc)
{
this.doc = doc;
// Получаем список БИДОВ
Log.d("TAD", "Получаем список БИДОВ");
Elements tmpBids = doc.select("a.go-product[href$=\"vats\"]");
for (int i = 0; i < tmpBids.size(); i++)
{
bids.add(tmpBids.get(i).attr("href"));
//Log.d("TAD", bids.get(i).toString());
}
}
private void parseResult(List<String> bids)
{
// Формируем данные feedsList для адаптера
Log.d("TAD", "Формируем данные feedsList для адаптера");
feedsList = new ArrayList<>();
for (int i = 0; i < bids.size(); i++)
{
FeedItem item = new FeedItem();
item.setTitle(bids.get(i));
item.setThumbnail("thumbnail");
feedsList.add(item);
}
}
}
您的代码存在一些问题。
OKHttpRequest(...)
开始有点混乱。client.newcall(request).execute()
强制阻止HTTP客户端,也可以像其他人建议的那样,使用像RxJava这样的库来处理链接异步命令。OKHttpClient
用于多个请求,特别是在使用cookie jar时。理想情况下,您只有OKHttpClient
的一个实例,并将其用于多个请求。您的cookie jar似乎可以工作,但这只是因为您使用全局列表来存储cookie,这可能是一个不好的做法。如果您可以添加OKHTTP3.JavaNetCookieJar
依赖项,您可以使用以下代码获得一个工作的cookie jar。
import okhttp3.JavaNetCookieJar;
CookieManager cookieManager = new CookieManager();
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
JavaNetCookieJar cookieJar = new JavaNetCookieJar(cookieManager);
OkHttpClient client = new OkHttpClient.Builder().cookieJar(cookieJar).build();
此外,在使用OkHttp
调试时遇到困难时,最好设置一个OkHttp日志拦截器。
HttpLoggingInterceptor logging =
new HttpLoggingInterceptor((msg) -> {
Log.d(msg);
});
logging.setLevel(Level.BODY);
client.addNetworkInterceptor(logging);
我在一个类中有一个imageView,在单击imageView时,会出现一个对话框,它有两个选项,可以从相机中获取图像,也可以打开设备的图像库。我想将图像从一个类发送到另一个类,这样它就可以出现在ImageView中。我搜索了很多小时,但我只得到关于从一个类到另一个类的文本数据发送。谁能告诉我从一个类到另一个类的图像发送? 这是来自sender类的代码,它将获取图像。 谢谢你的帮助
如何发送buf然后接收msg 方法 我正在尝试通过从连接出站发送msg并从入站接收msg然后返回消息Mono来实现此方法。但我只能在that(Publisher)方法中接收消息。它似乎无法返回数据Mono 我试过这个。 但它会一直阻塞,直到连接超时 我尝试了另一个代码。我添加了一个handle方法,并将响应放到map中。然后我可以得到单声道。fromSupply(),在映射处有一个while循环中
主谋。该类字符串数组中的java存储所有值public string[]itemcodes;我要访问主目录的条目代码。JAVA 主要的JAVA 主谋。java系统。出来println(项目代码[位置]);我在这里打印所有代码。不,我想在Main中打印相同的结果。JAVA
OkHttp3是否支持以下情况: x.x.x.x myapp.com y.y.y.y myapp.com 无法访问代理服务器。ProxySelector可用于顺序尝试多个代理服务器,最终返回到直接连接。 将此设置为false,以避免在重试请求具有破坏性时重试请求。在这种情况下,调用应用程序应该自己恢复连接故障。
我有一个Web服务,它使用Spring Rest Controller(使用Netty而不是Apache Tomcat)处理GET/POST/PUT HTTP请求。我希望过滤我服务中的所有请求,当请求配置了特定的标头时,我希望将此特定请求发送到一个完全不同的URL,同时将响应返回到发送原始请求的相同实体。 这是我的代码: 在这个实现中,请求只是传递给我的普通rest控制器,而不会到达其他服务。我错
以下是传入的JSON: 这里的JSONObject[“time”]不是字符串是我将它放入JSONArray时遇到的错误