java中如何判断发送的请求是不是得到响应
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中如何判断发送的请求是不是得到响应相关的知识,希望对你有一定的参考价值。
我自己的网站能否用ajax能否访问百渡之类的网站
前面提到,服务器在完成请求之后会在 XMLHttpRequest 的 onreadystatechange 属性中查找要调用的方法。这是真的,但还不完整。事实上,每当 HTTP 就绪状态改变时它都会调用该方法。这意味着什么呢?首先必须理解 HTTP 就绪状态。HTTP 就绪状态表示请求的状态或情形。它用于确定该请求是否已经开始、是否得到了响应或者请求/响应模型是否已经完成。它还可以帮助确定读取服务器提供的响应文本或数据是否安全。在 Ajax 应用程序中需要了解五种就绪状态:
• 0:请求没有发出(在调用 open() 之前)。
• 1:请求已经建立但还没有发出(调用 send() 之前)。
• 2:请求已经发出正在处理之中(这里通常可以从响应得到内容头部)。
• 3:请求已经处理,响应中通常有部分数据可用,但是服务器还没有完成响应。
• 4:响应已完成,可以访问服务器响应并使用它。
与大多数跨浏览器问题一样,这些就绪状态的使用也不尽一致。您也许期望任务就绪状态从 0 到 1、2、3 再到 4,但实际上很少是这种情况。一些浏览器从不报告 0 或 1 而直接从 2 开始,然后是 3 和 4。其他浏览器则报告所有的状态。还有一些则多次报告就绪状态 1。在上一节中看到,服务器多次调用 updatePage(),每次调用都会弹出警告框 —— 可能和预期的不同!
对于 Ajax 编程,需要直接处理的惟一状态就是就绪状态 4,它表示服务器响应已经完成,可以安全地使用响应数据了。基于此,回调方法中的第一行应该如 清单 13 所示。
清单 13. 检查就绪状态
function updatePage()
if (request.readyState == 4)
alert("Server is done!");
修改后就可以保证服务器的处理已经完成。尝试运行新版本的 Ajax 代码,现在就会看到与预期的一样,只显示一次警告信息了。
HTTP 状态码
虽然 清单 13 中的代码看起来似乎不错,但是还有一个问题 —— 如果服务器响应请求并完成了处理但是报告了一个错误怎么办?要知道,服务器端代码应该明白它是由 Ajax、JSP、普通 html 表单或其他类型的代码调用的,但只能使用传统的 Web 专用方法报告信息。而在 Web 世界中,HTTP 代码可以处理请求中可能发生的各种问题。
比方说,您肯定遇到过输入了错误的 URL 请求而得到 404 错误码的情形,它表示该页面不存在。这仅仅是 HTTP 请求能够收到的众多错误码中的一种(完整的状态码列表请参阅 参考资料 中的链接)。表示所访问数据受到保护或者禁止访问的 403 和 401 也很常见。无论哪种情况,这些错误码都是从完成的响应 得到的。换句话说,服务器履行了请求(即 HTTP 就绪状态是 4)但是没有返回客户机预期的数据。
因此除了就绪状态外,还需要检查 HTTP 状态。我们期望的状态码是 200,它表示一切顺利。如果就绪状态是 4 而且状态码是 200,就可以处理服务器的数据了,而且这些数据应该就是要求的数据(而不是错误或者其他有问题的信息)。因此还要在回调方法中增加状态检查,如 清单 14 所示。
清单 14. 检查 HTTP 状态码
function updatePage()
if (request.readyState == 4)
if (request.status == 200)
alert("Server is done!");
参考资料:http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro2/
参考技术A 用filter请求进出都要经过filter的
public void doFilter(ServletRequest req, ServletResponse resp,FilterChain fchain) throws IOException,ServletException
HttpServletRequest request=(HttpServletRequest)req;
System.out.print("请求");
fchain.doFilter(req,resp);
System.out.print("响应");
如何停止主 ui 线程,直到我得到来自 http 请求的响应
【中文标题】如何停止主 ui 线程,直到我得到来自 http 请求的响应【英文标题】:How to stop main ui thread until i get response from http request 【发布时间】:2017-04-20 10:41:02 【问题描述】:我的目标场景: 尝试向我的应用程序服务器发送一个简单的 HTTP 请求并获得一个 json 响应作为回报。根据 json 响应,我需要执行 segue 操作。
我目前的情景: 这发生在我的系统中。经过太多延迟后,我的 HTTP 请求得到了 json 响应,因为我的响应是在延迟之后执行的,甚至没有检查响应中的数据就执行了 segue。
我的要求 如何让我的 segue 等到我收到 HTTP 请求的响应?
[application getjsonResponse];
if([[defaults stringForKey:@"status"] isEqual:@"success"])
return YES;
这些是我使用的代码行。我不希望我的线程执行这个 if 条件,除非我得到对我的 HTTP 请求的响应。
到目前为止我尝试过的:
-
我尝试了线程睡眠方法,它有时有效,有时无效。
在我得到响应之前,我会迭代一个 while 循环。
好奇的问题 当我从桌面浏览器 (Chrome) 或移动浏览器向我的应用程序发出相同的请求时,我会立即得到响应,但是当我使用代码时,我似乎会在 10 秒或更长时间后得到结果。这是为什么呢?
这是我用来向我的应用服务器发送 http 请求的一段代码。
-(void)getjsonResponse
NSURL *url=[NSURL URLWithString: URLForApplication];
NSURLRequest *req=[NSURLRequest requestWithURL:url];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask connection=[session dataTaskWithRequest:req completionHandler:^(NSData data, NSURLResponse response, NSError error)
if (!error)
// Success
if ([response isKindOfClass:[NSHTTPURLResponse class]])
NSError *jsonError;
NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError];
if (jsonError)
// Error Parsing JSON
else
// Success Parsing JSON
// Log NSDictionary response:
NSLog(@"%@",jsonResponse);
NSString * statusCode=[[NSString alloc]init];
statusCode=jsonResponse[@"statusCode"];
_statusOtpResponse=jsonResponse[@"status"];
NSLog(@"status value: %@",_statusOtpResponse);
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:_statusOtpResponse forKey:@"status"];
[defaults setObject:statusCode forKey:@"statuscodeOtp"];
[defaults synchronize];
else
//Web server is returning an error
else
// Fail
NSLog(@"error : %@", error.description);
];
if(connection)
[connection resume];
【问题讨论】:
所以请使用正确的语法。此外,停止 UI 线程通常是一个非常糟糕的主意 - 它会使 GUI 响应并让用户认为应用程序可能崩溃了。 @tambre 所以我不想停止 ui 线程如何让 ui 线程等到我从 http 请求中得到响应请帮忙.. 【参考方案1】:好的。你的问题有很多矛盾之处。例如,您谈论执行 segue,但您的代码不包含任何执行此操作的内容。
无论如何,首先我要说的是,停止/暂停应用程序的主线程是个坏主意。时期。当您执行此类操作时,或以任何方式在主线程上运行需要大量时间来执行的代码时,您实际上会使您的应用程序无响应,并且无响应的应用程序被用户视为质量差,因此不值得使用。
以下是我将如何重写您的代码以执行 segue。注意主线程上的回调。
NSURL *url = [NSURL URLWithString: URLForApplication];
NSURLRequest *req = [NSURLRequest requestWithURL:url];
NSURLSession *session = [NSURLSession sharedSession];
// Do something here to indicate a server query is executing.
// For example, displaying a UIActivityIndicatorView
// Note: you had a missing '*' on this line
NSURLSessionDataTask *connection = [session dataTaskWithRequest:req completionHandler:^(NSData data, NSURLResponse response, NSError error)
// First error check.
if (error)
// Log and/or display alert with error message and finish.
// Reset display to non busy mode on main thread.
NSLog(@"error : %@", error.description);
return;
// We're here, so request was a success
if ([response isKindOfClass:[NSHTTPURLResponse class]])
NSError *jsonError;
NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError];
if (jsonError)
// Log and/or display alert with error message and finish.
// Reset display to non busy mode on main thread.
NSLog(@"error : %@", error.description);
return;
// We're here, so JSON parse was a success
NSLog(@"%@", jsonResponse);
NSString *statusCode = jsonResponse[@"statusCode"];
NSString *statusOtpResponse = jsonResponse[@"status"];
if (/* test variables to decide if to execute the segue */)
// Now we know we want to execute the segue.
dispatch_async(dispatch_get_main_queue(), ^
[self performSegueWithIdentifier:@"segue-id" sender:self];
);
// Removed your code for storing response codes in user defaults because I simply could not see why you would do that.
];
// Execute
[connection resume];
```
【讨论】:
感谢回复..我使用 userdefaults 存储来自 jsonresponse 的值,我尝试从视图控制器中 userdefault 的 jsonresponses 中获取值,然后执行 segue。【参考方案2】:NSURLSessionDataTask 已经被系统异步执行了。
因此,如果您想在收到请求的数据后执行转场,只需将转场代码放在完成块中即可。
在您的情况下,就在您处理响应数据之后,例如在以下行之后:
[defaults synchronize];
请注意,在再次在主线程上工作之前,您应该先分派到主线程。
dispatch_async(dispatch_get_main_queue(), ^
// YOUR SEGUE HERE
);
【讨论】:
以上是关于java中如何判断发送的请求是不是得到响应的主要内容,如果未能解决你的问题,请参考以下文章
java 网络编程中 tcp连接问题。 例如编写聊天室 , c/s结构的c和s端都是不间断实现请求--响应 。
怎样用JAVA实现模拟HTTP请求,得到服务器的响应时间等参数