URL编码iOS NSURL错误

2024-01-01

在桌面上的 Firefox、Chrome 浏览器中打开的 URL 在 iPhone 上的 WebView 中无法打开。 该 URL 据称正在访问 GET 请求。 创建 NSURL 时不进行百分号转义,则不会生成 url。 使用percentescape 时,url 会重定向到错误的url 内容。

桌面浏览器上使用的编码是否与 iPhone 上使用的编码不同?或者手机 Safari 浏览器? 除了使用之外,还有其他方法在 iOS 中对 URL 进行编码吗

-stringByAddingPercentEscapesUsingEncoding
-CFURLCreateStringByAddingPercentEscapes

它会从服务器生成错误的请求内容页面。

任何帮助都会非常好,谢谢。

EDIT:
生成的URL如下

http://something.test.com/iostest/index.html?{"a":"b"}

设法发现未对大括号进行编码导致了 iOS 中的问题。 如

NSString *tempUrlSting = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)tempURLA,CFSTR("{}"), CFSTR("\""), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding)));
NSURL *tempUrl=[NSURL URLWithString:tempUrlSting];
  1. 如果不对 URL 中的大括号进行编码,而是使用上面的 [Rob 的回答][1] 对其余部分进行编码。创建 NSURL 时,url 为空。
  2. 如果对大括号进行编码,则可以正常生成 URL,但服务器会抛出异常。

This Question https://stackoverflow.com/questions/8335796/nsurl-with-curly-braces建议使用CFNetworking。

EDIT
使用 CFNetworking 如下

-(void)getDataFromUrl{
    CFStringRef tempURLA = CFSTR("http://my.test.server/iostest/index.html?{\"a\":\"b\"}");
    CFStringRef tempUrlSting = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)tempURLA,CFSTR("{}"), CFSTR("\""), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));

    CFURLRef myURL = CFURLCreateWithString(kCFAllocatorDefault, tempUrlSting, NULL);

    CFStringRef requestMethod = CFSTR("GET");
    CFHTTPMessageRef myRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault, requestMethod, myURL,kCFHTTPVersion1_1);

    CFStringRef headerFieldName = CFSTR("Accept");
    CFStringRef headerFieldValue = CFSTR("text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
    CFHTTPMessageSetHeaderFieldValue(myRequest, headerFieldName, headerFieldValue);


    [self performHTTPRequest:myRequest];

}

-(void)performHTTPRequest:(CFHTTPMessageRef)request {
    CFURLRef gotdatab = (__bridge CFURLRef)(CFBridgingRelease(CFHTTPMessageCopyRequestURL(request)));
//    NSLog(@"(CFHTTPMessageRef request  %@",gotdatab);

    CFReadStreamRef requestStream = CFReadStreamCreateForHTTPRequest(NULL, request);

    CFReadStreamOpen(requestStream);

    NSMutableData *responseBytes = [NSMutableData data];
    NSError *error;

    while (TRUE) {

        if (CFReadStreamHasBytesAvailable(requestStream)) {
            UInt8 streambuffer[1024];
            int readBytes = CFReadStreamRead (requestStream,streambuffer,sizeof(streambuffer));
            NSLog(@"Read: %d",readBytes);
            [responseBytes appendBytes:streambuffer length:readBytes];
        }

        if (CFReadStreamGetStatus(requestStream) == kCFStreamStatusError) {

            error = (NSError*)CFBridgingRelease(CFReadStreamCopyError (requestStream));
            if ([error code] == 61) {
                // connection refused
                NSLog(@"Error occured: %d",[error code]);
            }
            break;
        }
        if (CFReadStreamGetStatus(requestStream) == kCFStreamStatusAtEnd) {
            NSLog(@"Stream reached end!");
            error = nil;
            break;
        }

    }//
    CFHTTPMessageRef response = (CFHTTPMessageRef)CFReadStreamCopyProperty(requestStream, kCFStreamPropertyHTTPResponseHeader);

    if (response==NULL) {
        NSLog(@"response is null");
        return;
    }
}

以上是使用以下示例完成的here http://jameswilliams.me/developer/blog/2008/08/http-post-via-the-cfnetwork-stack/ and here http://lists.apple.com/archives/macnetworkprog/2013/May/msg00000.html

上述方法仍然存在同样的问题。也就是说:如果 {} 未编码,则不会生成 URL。如果 {} 已编码,则服务器不会返回正确的值。

有什么建议吗?


有时 URL 编码格式已经除了 é 字符之外,它可能应该编码为 %c3%a9。桌面浏览器对无效 URL 的处理相当自由,这就是它在 Safari 等中工作的原因。 因此,如果您有一个 NSString 并且想将其转换为正确的 URL 编码,请使用 NSString 类的以下方法。

NSURL* url = [NSURL URLWithString:[strURL stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

URL编码iOS NSURL错误 的相关文章

  • Swift - 集成 GameCenter 以使用排行榜

    我正在用 Swift 制作一个游戏 我希望能够使用 GameCenter 发布用户的分数 以便可以看到所有用户的分数 然而 我花了一天的时间试图弄清楚如何做到这一点 但我没有找到任何有用的说明 我对 iOS 编程和 Swift 还很陌生 关
  • 用于 RSS feed 解析的 Objective-C 库?

    我正在为 iOS 应用程序寻找一个 Objective C 库 该库将解析并显示 RSS 提要中的文章 具体来说 我正在寻找为新闻网站制作一个应用程序 如果可能的话 该框架应该能够使用各种 RSS XML 结构 嗯 有两个不同的新闻网站 一
  • 即使设置了语言环境,data.frames中的藏文字符也无法在R控制台中显示(中文可以,矩阵中的藏文可以)

    在 R 中 藏文字符位于 data frames 中时无法正确显示 gt Sys setlocale LC CTYPE Tibetan 1 Tibetan China 950 gt data frame a a 1
  • 迭代 NSDictionary 时保持顺序

    我有一个 NSDictionary 它正在迭代并将数据保存到核心数据 如下所示 NSDictionary details valueDict objectForKey shipment master for NSDictionary res
  • Objective-c 截断字符串并在末尾添加省略号

    如何在 Objective C 中截断字符串 然后在末尾添加省略号 NSString origString A very long string blah blah blah const int clipLength 18 if origS
  • 添加 UITabBarController 时出错

    我在用着单点触控C 编写具有多个不同屏幕的 iPhone 应用程序 为了简单起见 我将仅描述导致我遇到问题的控制器的几个屏幕 我遇到的问题是 当我创建一个继承自的类时 我收到此错误消息UITabBar控制器 应用程序窗口应该有一个根视图控制
  • MVVM模式下向UIViewController传递数据

    我正在为我的视图控制器使用 MVVM 但我遇到了一个问题 我不确定解决它的最佳方法是什么 基本上 视图控制器 A 显示一个表视图 其中填充了视图模型 A 中的数据 每个单元格都有自己的视图模型 视图模型 A 负责创建这些视图模型并将它们公开
  • 使用 REST API 实现属性/字段级安全

    我正在为支持多租户授权模型的 REST API 构建概念验证 该模型不仅控制用户可以访问哪些对象 还控制对象中的字段 此模型的目标是确保租户管理员只能修改其租户并且只能查看允许的对象属性 我有一个正在开发的现有代码库 可在以下位置公开获取
  • 在 UIView 中的贝塞尔曲线路径内像草图颜色一样绘制/绘制

    我正在 UIView 上的 UIBezierPath 的帮助下绘制形状图层 CAShapeLayer pathLayer CAShapeLayer layer pathLayer frame CGRectMake view frame or
  • React + Redux 和 REST API?

    我在 Node 中构建了一个简单的 CRUD 应用程序 并已在 Express 中完成了其余 API 的创建 我现在正在寻求添加前端功能 并希望使用 React Redux 作为学习练习 然而 似乎所有围绕此的教程都直接使用 Redux 访
  • Spring boot - 嵌入式 Tomcat - 连接器定制器 - 无法添加 parseBodyMethods 属性

    最初的问题是当我使用 DELETE 方法发送http请求时 正文部分无法发送到服务器 经过谷歌搜索后 我发现本文 https stackoverflow com questions 41205062 requestbody not acce
  • WatchOS 应用程序未检测到配套的 iOS 应用程序

    我正在制作一个独立的Apple Watch应用程序 但有一个配套的iPhone应用程序 这对于手表应用程序的运行来说不是必需的 该应用程序使用手表连接如果安装了 iPhone 配套应用程序 则可以在设备之间同步数据 我可以打电话sessio
  • MVC3 RESTful API 路由和 Http 动词处理

    我想为我的 MVC3 应用程序构建 RESTful Json Api 我需要帮助处理多个 Http Verbs 以操作单个对象实例 我读过 研究过 尝试过的内容 MVC 属性 HttpGet HttpPost等 允许我拥有一个具有多个共享相
  • Mobile Safari 中的 React PWA 图像上传会破坏应用程序吗?

    我们很惊讶在网上没有发现任何提及此问题的信息 因此我们在此发帖希望能找到解决方案 当我们在使用 iPhone 进行移动 Safari 浏览时遇到此问题 运行下面 2 个易于遵循的测试 一个有效 一个无效 链接在这里https pwa rea
  • 如何从应用程序扩展启动父 iOS 应用程序

    有谁知道如何从应用程序扩展的视图控制器启动父应用程序 我只想从其应用程序扩展启动主应用程序 在 WWDC 会议上为 iOS 和 OS X 创建扩展 第 1 部分 https developer apple com videos wwdc 2
  • iOS 11.x 系统颜色

    我读过很多关于如何自定义视图颜色的文章 但没有任何关于检索标准控件 如 iOS 11 x 或以前版本中的导航栏 状态栏和选项卡栏 的系统颜色的文章 UIColor 类有 3 种系统颜色 但它们几乎没有用 例如 调用 UINavigation
  • 自定义 UITableViewCell 中按钮上的 IBAction

    使用 iOS 5 我有一个场景 我必须使用自定义单元格创建一个 tableView 自定义单元格有一个名为 TainingCellController 的控制器 UITableViewCell 的子类和一个 NIB 文件 TrainingC
  • 使用 Objective-C 将 XMP 数据嵌入到 PNG

    我需要将自定义 XMP 文件嵌入到 iOS 应用程序中的 PNG 中 到目前为止 我能做的就是编译 Adob e XMP 工具包 生成 Xcode 项目 然后正确编译该项目 从那里我不知道如何在我的 Xcode 项目中使用该库以及如何使用它
  • 如何添加私有 Spec Repo 以使用私有 Pod?

    我完成了这个教程http guides cocoapods org making private cocoapods html http guides cocoapods org making private cocoapods html但
  • 标签栏不显示图标?

    我读了一堆相关的问题 我尝试了他们所说的 但没有任何效果 不知道为什么 所以 我有3个不同的UIStoryboards 第一个是处理登录 注册的 Auth Storyboard 并且有一个对第二个 Storyboard 选项卡栏 Story

随机推荐

  • Vb.net 2010,如何同时使用两个过滤器

    我想一次使用两列在 Visual Basic 中过滤 datagridview 例如 我想过滤主题列和姓氏列 我目前使用此代码 me studentbindingsource filter Subject code like ComboBo
  • 使用带有令牌的 Google API [Django 和 AllAuth]

    我在 Django 应用程序上使用 AllAuth 来管理用户身份验证 这样我的用户就可以连接他们的 Google 帐户 并且我获得一个 google API 令牌 具有适当的范围 我想使用该令牌来访问 google API 在我的例子中是
  • 使用 Genymontion 进行本机反应抛出并发异常

    我有基本的反应本机应用程序并尝试在 Genymon 中运行 目前我遇到错误 java util concurrent ExecutionException java lang RuntimeException ReferenceError
  • 请解释一下这些 Python Fetch 类型

    这些抓取有什么区别 请给我一个参考网站的例子 以得到清晰的想法 我仍然对此感到困惑 res cr dictfetchall res2 cr dictfetchone res3 cr fetchall res4 cr fetchone cr
  • symfony2动态数据库连接使用主义

    我试图在 Symfony 2 中建立多个数据库连接 但无法做到这一点 我在 Google 和 stack overflow 中进行了广泛的搜索 但在任何地方都是通过 config yml 文件或动态数据库完成的 其中所有数据库都具有相同的
  • @RequestMapping 注释中“params”的含义?

    我知道 RequestMapping 注释在基于 Spring MVC 的应用程序中使用 我遇到了这段代码 RequestMapping method POST params someParam 我明白了method 然而我不知道什么par
  • 从指针到成员的映射

    Note in case this feels like an X Y problem scroll below the separator for how I arrived at this question 我正在寻找一种方法来存储指向
  • 如何在 QML 中创建矩形滚动条

    就像网页一样 当内容超出矩形时 就会出现滚动条 还有其他人可以帮助我吗 我尝试过使用列表视图 但无法在矩形中使用它 文档中有一个例子 如何使用ScrollBar https doc qt io qt 5 qml qtquick contro
  • 如何使用 Intellij 插件创建自定义实时模板

    我想创建一个可与我的插件一起使用的自定义实时模板 我知道如何使用 设置 对话框创建自定义实时模板 但我希望能够将实时模板作为我的插件的一部分分发 怎么样实时模板在插件中定义 在应用程序中注册它的入口点在哪里 Thanks 使用12 1 5
  • SASS:获取现有背景字符串的值并添加到其中?

    我想在 SASS Compass 中额外构建背景 而不考虑现有的背景字符串 我可以通过写入全局变量来完成 但看起来很草率 Pseudo mixin add icon add a background icon mixin add gradi
  • 引入先前证明的定理作为假设

    假设我已经在coq中证明了某个定理 稍后我想将其作为假设引入到另一个定理的证明中 有没有一种简洁的方法来做到这一点 当我想做一些诸如案例证明之类的事情时 我通常会出现这种需要 我发现做到这一点的一种方法是assert陈述定理 然后立即证明它
  • 如何使用 Zeromq 的 inproc 和 ipc 传输?

    我是 ZERMQ 的新手 ZeroMQ 具有 TCP INPROC 和 IPC 传输 我正在寻找在 Winx64 和 python 2 7 中使用 python 和 inproc 的示例 这些示例也可以用于 Linux 另外 我一直在寻找
  • 无法加载 Boost.Python 模块 - 未定义的符号

    我有一个用 C 编写的库 需要从 Python 访问 所以我使用 Boost Python 包装它 我可以毫无问题地将我的库编译成 Boost so 文件 但是当我尝试将其加载到 Python 中时 使用import tropmodboos
  • 改造 404 未找到 Web api

    我有一个网络 API 和一个应用程序 所以我想要一个注册应用程序 但我有一个问题 我用的是天蓝色的 有我的registerapi 界面 FormUrlEncoded POST application json public void ins
  • 如何在 Yocto 构建中将第三方库添加为包

    我有一个不知名的库 并且没有适用于该库的包https github com dailab libsml https github com dailab libsml通常我通过以下方式在我的设备上安装这个库make install如何将此库作
  • 获取数学函数作为用户的输入

    我需要知道如何将字符串输入传输到可执行函数 例如 用户编写字符串 x Sin x 2 然后程序将其作为函数 可以计算给定 x 的值 可以绘制该函数的推导图等 我读到有一个名为scitools stringfunction 但据我所知该模块在
  • 返回时如何跳过浏览器历史记录中的页面?

    我有一个带有路由器的 Angular 2 应用程序 假设用户位于应用程序中的页面 A 然后导航到页面 B 然后导航到页面 C 此时 当他单击浏览器上的 后退 按钮时 我希望他返回到页面 A 跳过 B 我怎样才能实现它 当从 B 导航到 C
  • 如何将环境变量传递给使用自定义容器创建的 gcloud beta ai 自定义作业 (Vertex AI)

    我正在谷歌的 Vertex AI 中运行自定义训练作业 一个简单的gcloud执行自定义作业的命令将使用类似以下语法的内容 可以查看该命令的完整文档here https cloud google com sdk gcloud referen
  • 停止 VS 2010 在 else 关键字后自动创建大括号

    我正在使用 VS 2010 当我输入 else 然后它自动返回行并添加大括号时 我总是感到恼火 就像是 else 我无法想象我是唯一一个经常在其他内容后面加上俏皮话并且不喜欢大括号的人 我该如何阻止这种情况发生 我也发现这种行为非常烦人 我
  • URL编码iOS NSURL错误

    在桌面上的 Firefox Chrome 浏览器中打开的 URL 在 iPhone 上的 WebView 中无法打开 该 URL 据称正在访问 GET 请求 创建 NSURL 时不进行百分号转义 则不会生成 url 使用percentesc