IOS系统 H5 Https请求后端很慢

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IOS系统 H5 Https请求后端很慢相关的知识,希望对你有一定的参考价值。

参考技术A 如果最近发现ios APP打开h5非常慢,达到5秒以上,而安卓是正常,如果刚好你又是使用了Let's Encrypt 的免费SSL服务,恭喜你,你可能是一位运营商干扰的受害者。

正常的域名dig信息

错误的dig信息

SSL服务,如果新版系统的ios web浏览器来浏览,会在加密通信的某个阶段,对CA证书的有效性进行验证,如果验证不了,一般也会允许访问,但会提示错误,这个验证,如果域名访问不了,你造成了等待超时才返回,这就是慢的原因。而非webview或安卓webview访问,因为没有实现ocsp验证的流程,故访问速度是正常的,没有区别。

因为Let's Encrypt的OCSP验证阶段,需要使用域名ocsp.int-x3.letsencrypt.org(x后面的数字可能是1-4中之一)进行验证,而这个域名对应的服务器是托管在 a771.dscq.akamai.net ,不知何故,最近墙把它拦截了,就导致所以h5的访问卡在这了,当然,如果你不用ssl是没有问题的。

1、不用ssl

2、等墙解封

3、在webserer配置 OCSP Stapling功能

如果你采用第3个方法,这里详细解释一下。

ocsp stapling是什么,简单的讲,就是将原来由各个用户去发起验证证书有效性的请求,由webserver代劳了,这样就不用每个用户都去连CA的验证服务器了,相对来说访问速度就会加快不了。如果你使用的是nginx,可以这样配置开启ocsp stapling:

*将配置里的your.domain.com替换成你自己的域名。

修改完配置重启webserver。

还有为了避免域名污染,导致解析失败,还需要修改/etc/resolve.conf(假设是CentOS),添加以下记录:

等等,即使由服务器代劳,你服务器不也一样访问不了CA的验证服务器,如上述 a771.dscq.akamai.net 域名,你抓到关键点了,确实也访问不了,你如果通过网上的教程去配置,也会发现ocsp response请求会失败,错误提示如:

并且在webserver的error.log里有会有以下信息

嗯,验证仍然有问题的,但是经过测试,实际访问速度是正常的。第一次请求可能会慢,因为前几次请求,服务器会去请求验证,后面请求就会快了,即使没验证成功,它也会缓存这个结果。

iOS(目标c)将带有json的post请求发送到php后端

【中文标题】iOS(目标c)将带有json的post请求发送到php后端【英文标题】:iOS (objective c) send post request with json to php backend 【发布时间】:2016-08-10 11:09:43 【问题描述】:

我在 iOS 中的代码:

NSString * some_str = @"\"one\":\"two\",\"three\":\"four\"";
NSData *objectData = [some_str dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:objectData
                                                     options:NSJSONReadingMutableContainers
                                                       error:&error];  
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[manager POST:@"https://exmaple.com/post.php" parameters:json progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) 
    NSLog(@"JSON: %@", responseObject);
 failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) 
    NSLog(@"Error: %@", error);
];

我在后端的代码(PHP):

<?php
if(strcasecmp($_SERVER['REQUEST_METHOD'], 'POST') != 0)
    throw new Exception('Request method must be POST!');

$contentType = isset($_SERVER["CONTENT_TYPE"]) ? trim($_SERVER["CONTENT_TYPE"]) : '';
if(strcasecmp($contentType, 'application/json') != 0)
    throw new Exception('Content type must be: application/json');


//Receive the RAW post data.
$content = trim(file_get_contents("php://input"));
$decoded = json_decode($content, true);
echo $content;


// $responses = array();
header("Content-type: application/json, charset=utf-8");
// echo json_encode($responses);

$conn->close(); 

?>

如果我回显 $content,iOS 收到的响应将是一些十六进制数字。即 3c21444f 43545950(json 字符串的十六进制数从尾部到头部由“&”符号连接,即三=四&一=二)。如果我回显 $decoded,它会返回一个空的 json。

如果我尝试解码 Post 请求收到的 json,它会失败。我认为接收到的对象可能是 json_decode 函数的输入。

我应该重写我的 iOS 代码或 PHP 代码还是两者兼而有之?

【问题讨论】:

你设置错了这一行: NSString * some_str = @"\"one\":\"two",\"three\":\"four\""; '\' 的原因没有放在两个之后,请检查您的数据。 @BhadreshKathiriya 这是一个错字。我会纠正它。谢谢。 为什么要通过NSString来构造参数?你执行 NSString => NSData => NSDictionary,AFHTTPSessionManager 将执行 NSDictionary => NSData。 我猜你可以用邮递员测试你的 php 代码,这将缩小对 bug 的搜索范围 谢谢大家!我自己解决了这个问题! 【参考方案1】:

试试这个...可能有帮助

创建一个方法并将参数传递给该方法

+ (void)apiRequestForPOSTWithServiceName:(NSString *)serviceName andParameters:(NSDictionary *)parameter withCompletion:(void(^)(id response, BOOL isSuccess))completion

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
NSString *url = [NSString stringWithFormat:@"%@%@", BASE_URL, serviceName];
[manager POST:url parameters:parameter success:^(AFHTTPRequestOperation *operation, id responseObject) 
    //NSLog(@"JSON: %@", responseObject);

    completion(responseObject,YES);

 failure:^(AFHTTPRequestOperation *operation, NSError *error) 
    NSLog(@"Error: %@", error);

    completion(error,NO);
];

谢谢...

【讨论】:

你能告诉我为什么吗? 为了代码可重用的目的..只要你想把值传递给那个方法。 我认为这不是问题所在。不过谢谢。我会记住这一点。

以上是关于IOS系统 H5 Https请求后端很慢的主要内容,如果未能解决你的问题,请参考以下文章

iOS - webView加载https

微信H5页面嵌入百度地图---解决手机的webKit定位,ios系统对非https网站不提供支持问题

iOS v12 Https 请求错误

Python 请求很慢并且需要很长时间才能完成 HTTP 或 HTTPS 请求

想办法设置 HTTPS

浅淡iOS app加载h5页面