understand 无法跳转全局跳转跳转失败

Thunder Thinking and Action to enjoy loose life
OkHttp解析系列-重定向和出错重试
&这是OkHttp系列博文的第一篇,之前写过一篇草稿,介绍OkHttp的整体框架,但是感觉涉及的知识太多,无法在一篇中讲述清楚,所以,之后的博文都只关注某一方面的知识,争取文章短小精悍。
今天主要研究一下OkHttp发送Http请求过程中的重定向和出错重试,主要涉及的源码文件有Call.java``HttpEngine.java。
我们今天研究Call的Response getResponse(Request request, boolean forWebSocket) throws IOException函数,它是你调用Call.execute()返回Response所调用的核心函数,主要功能是新建一个HttpEngine发送Request然后处理出错重试和重定向问题。
RequestBody body = request.body();
if (body != null) {
Request.Builder requestBuilder = request.newBuilder();
MediaType contentType = body.contentType();
if (contentType != null) {
requestBuilder.header("Content-Type", contentType.toString());
long contentLength = body.contentLength();
if (contentLength != -1) {
requestBuilder.header("Content-Length", Long.toString(contentLength));
requestBuilder.removeHeader("Transfer-Encoding");
requestBuilder.header("Transfer-Encoding", "chunked");
requestBuilder.removeHeader("Content-Length");
request = requestBuilder.build();
这是函数的第一部分,主要是将RequestBody的一些元数据拷贝到Header的首部中,主要是Content-Type和Transfer-Encoding。Content-Type相信大家都了解,标示RequestBody的Mime-Type,格式为主类型/子类型,比如text/xml。而Transfer-Encoding是表示一种网络传输的方式,想具体了解的同学可以看一下这个链接.
engine = new HttpEngine(client, request, false, false, forWebSocket, null, null, null, null);
int followUpCount = 0;
while (true) {
if (canceled) {
engine.releaseConnection();
throw new IOException("Canceled");
engine.sendRequest();
engine.readResponse();
} catch (RequestException e) {
throw e.getCause();
} catch (RouteException e) {
HttpEngine retryEngine = engine.recover(e);
if (retryEngine != null) {
engine = retryE
throw e.getLastConnectException();
} catch (IOException e) {
HttpEngine retryEngine = engine.recover(e, null);
if (retryEngine != null) {
engine = retryE
在这段代码中,OkHttp建立一个HttpEngine对象来负责Http层级的请求的发送和回复的接收,HttpEngine会在之后的博文中详细讲解。然后进入了一个while循环,这个循环其实主要是处理重定向问题的。我们在这一节中主要关注catch中的逻辑,这是用于处理出错重试的逻辑。由于外层有一个while循环,所以在catch中尝试获得retryEngine,如果有就continue,没有就抛出异常。
重定向处理
Response response = engine.getResponse();
Request followUp = engine.followUpRequest();
if (followUp == null) {
if (!forWebSocket) {
engine.releaseConnection();
if (++followUpCount & MAX_FOLLOW_UPS) {
throw new ProtocolException("Too many follow-up requests: " + followUpCount);
if (!engine.sameConnection(followUp.httpUrl())) {
engine.releaseConnection();
Connection connection = engine.close();
request = followUp;
engine = new HttpEngine(client, request, false, false, forWebSocket, connection, null, null,
response);
这里我们可以看到Http重定向的机制。Request request = engine.followUpRequest()来获得重定向需要发送的Request,如果没有或者重定向次数大于MAX_FOLLOW_UPS就不会重新发送重定向请求。然后判断重定向请求和原请求的HttpUrl是否相同,否则也不会发送重定向请求。然后Connection connection = engine.close()会释放资源并且复用上次的连接,然后新建一个HttpEngine然后继续While循环发送请求。
重定向状态码解析
public Request followUpRequest() throws IOException {
if (userResponse == null) throw new IllegalStateException();
Proxy selectedProxy = getRoute() != null
? getRoute().getProxy()
: client.getProxy();
int responseCode = userResponse.code();
switch (responseCode) {
case HTTP_PROXY_AUTH:
if (selectedProxy.type() != Proxy.Type.HTTP) {
throw new ProtocolException("Received HTTP_PROXY_AUTH (407) code while not using proxy");
case HTTP_UNAUTHORIZED:
return OkHeaders.processAuthHeader(client.getAuthenticator(), userResponse, selectedProxy);
case HTTP_PERM_REDIRECT:
case HTTP_TEMP_REDIRECT:
if (!userRequest.method().equals("GET") && !userRequest.method().equals("HEAD")) {
return null;
case HTTP_MULT_CHOICE:
case HTTP_MOVED_PERM:
case HTTP_MOVED_TEMP:
case HTTP_SEE_OTHER:
if (!client.getFollowRedirects()) return null;
String location = userResponse.header("Location");
if (location == null) return null;
HttpUrl url = userRequest.httpUrl().resolve(location);
if (url == null) return null;
boolean sameScheme = url.scheme().equals(userRequest.httpUrl().scheme());
if (!sameScheme && !client.getFollowSslRedirects()) return null;
Request.Builder requestBuilder = userRequest.newBuilder();
if (HttpMethod.permitsRequestBody(userRequest.method())) {
requestBuilder.method("GET", null);
requestBuilder.removeHeader("Transfer-Encoding");
requestBuilder.removeHeader("Content-Length");
requestBuilder.removeHeader("Content-Type");
if (!sameConnection(url)) {
requestBuilder.removeHeader("Authorization");
return requestBuilder.url(url).build();
return null;
这一段就是根据回复的状态码生成重定向请求的代码逻辑。
HTTP_PROXY_AUTH 407
表示需要经过代理服务器认证 ,这时抛出异常,不进行重定向
HTTP_UNAUTHORIZED 401 身份未认证
HTTP_PERM_REDIRECT 308 HTTP_TEMP_REDIRECT 307 这两种状态码时,只有当请求的method不为GET和HEAD时不进行重定向,否则按照下边一列状态码的方式处理
HTTP_MULT_CHOICE
300 HTTP_MOVED_PERM 301 HTTP_MOVED_TEMP 302 HTTP_SEE_OTHER 303 当是这些状态码时,先判断是否运行重定向,然后获得Response中的Location首部的值,然后用HttpUrl去解析,如果是host不同,那么去掉所有的认证首部,这是为了安全。
今天所总结的只是Http的重定向部分和OkHttp中的关于重定向的逻辑部分。之后会陆陆续续的继续总结关于Http的知识。
本文也在我的独立博文中同时发布
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!&>&understand破解版——程序分析利器
understand破解版——程序分析利器
上传大小:46.14MB
Understand功能完美强大:
1、支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的project也支持
2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X
3、代码语法高亮、代码折迭、交叉跳转、书签等基本阅读功能。
4、可以对整个project的architecture、metrics进行分析并输出报表。
5、可以对代码生成多种图(butterfly graph、call graph、called by graph、control flow graph、UML class graph等),在图上点击节点可以跳转到对应的源代码位置。
6、提供Perl API便于扩展。作图全部是用Perl插件实现的,直接读取分析好的数据库作图。
7、内置的目录和文件比较器。
8、支持project的snapshot,并能和自家的TrackBack集成便于监视project的变化。
界面没有source insight漂亮,但有些功能比SI强大。尤其是画类图,函数调用图上。随便选择一个函数名,可以追溯到main到这个函数的调用过程。
虚函数被哪些类重载过,也一目了然。
...展开收缩
综合评分:4
12积分/C币
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, data.com_username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click", '.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有85条
浏览C语言代码,直接绘制个函数间的调用关系图,很好用。
资源可用,非常好,感谢
可以用,真的不错
VIP会员动态
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
输入下载码
为了良好体验,不建议使用迅雷下载
understand破解版——程序分析利器
会员到期时间:
剩余下载个数:
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
无法举报自己的资源
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可返还被扣除的积分
被举报人:
举报的资源分:
请选择类型
资源无法下载 ( 404页面、下载失败、资源本身问题)
资源无法使用 (文件损坏、内容缺失、题文不符)
侵犯版权资源 (侵犯公司或个人版权)
虚假资源 (恶意欺诈、刷分资源)
含色情、危害国家安全内容
含广告、木马病毒资源
*详细原因:
understand破解版——程序分析利器您的位置: →
→ Scientific Toolworks Understand中文破解版 v4.0891 注册版 64位
Scientific Toolworks Understand中文破解版 v4.0891 注册版 64位understand破解版下载|
网友评分:8
软件大小:75.5M
软件语言:中文
软件类型:国产软件
软件类别:免费软件 / 编程工具
更新时间:
软件等级:
官方网站:暂无
运行环境:WinAll, WinXP, Win7, Win8, Win10
软件厂商:
顶好评:50%
同类相关软件
34.2M/中文/10.021.7M/多国语言[中文]/10.03.7M/中文/10.06.2M/中文/10.04.6M/中文/10.0
understand中文版是一款非常好用的源码阅读工具,有了它以后,用户就可以非常便捷的进行代码的阅读和审阅了,欢迎有需要的朋友到绿色资源网下载使用!官方介绍Scientific Toolworks Understand是一款定位于代码阅读的软件。界面用Qt开发的。understand破解版特色1.可以对整个project的architecture、metrics进行分析并输出报表。2.可以对代码生成多种图(butterfly graph、call graph、called by graph、control flow graph、UML class graph等),在图上点击节点可以跳转到对应的源代码位置。3.支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的project也支持4.多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X5.代码语法高亮、代码折迭、交叉跳转、书签等基本阅读功能。6.提供Perl API便于扩展。作图全部是用Perl插件实现的,直接读取分析好的数据库作图。7.内置的目录和文件比较器。8.支持project的snapshot,并能和自家的TrackBack集成便于监视project的变化。
其他版本下载
Understand中文破解版 v4.0891 注册版 64位
软件无法下载或下载后无法使用,请点击报错,谢谢!
请描述您所遇到的错误,我们将尽快予以修正,谢谢!
*必填项,请输入内容
本类下载排行
6.31 5.12 8.03 6.84 1.65 2.16 5.27 10.08 .09 2.610 5.211 6.412 8.013 4.114 8.515
本类精品软件
30.3M/中文/5.33.2M/英文/4.4753KB/中文/6.8439.2M/英文/5.73.60G/中文/8.2183.2M/中文/6.210.3M/中文/8.0
装机必备软件
本类集合软件understand用户使用指南2_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
understand用户使用指南2
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩113页未读,
定制HR最喜欢的简历
你可能喜欢&>&understand用户使用指南
understand用户使用指南
上传大小:3.88MB
understand用户使用指南,支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的project也支持2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X3、代码语法高亮、代码折迭、交叉跳转、书签等基本阅读功能。
综合评分:5
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, data.com_username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click", '.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有2条
不错,正需要一个很好的教程
还可以,不是很详细
综合评分:
积分/C币:12
亲亲Friends
综合评分:
积分/C币:10
VIP会员动态
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
输入下载码
为了良好体验,不建议使用迅雷下载
understand用户使用指南
会员到期时间:
剩余下载个数:
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
无法举报自己的资源
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可返还被扣除的积分
被举报人:
举报的资源分:
请选择类型
资源无法下载 ( 404页面、下载失败、资源本身问题)
资源无法使用 (文件损坏、内容缺失、题文不符)
侵犯版权资源 (侵犯公司或个人版权)
虚假资源 (恶意欺诈、刷分资源)
含色情、危害国家安全内容
含广告、木马病毒资源
*详细原因:
understand用户使用指南

我要回帖

更多关于 understand 跳转 的文章

 

随机推荐