基于REST协议实现iPhone和Google App Engine之间的通信

Windows Phone 7技术解剖:触控原生操作系统的设计哲学与工程实践 移动操作系统不仅是软件平台,更是人机交互范式的物理载体。从底层内核重构、传感器融合算法到硬件认证体系,WP7以严苛的工程约束践行‘体验一致性’这一核心命题。其基于物理模型的Panorama动画引擎、采用卡尔曼滤波的多传感器融合方案、以及Isolated Storage与Background Agent构成的离线-后台协同架构,共同指向一个被长期忽视的技术本质:在资源受限的移动终端上,确定性体验比参数性能更关键。这些设计思想深刻影响了后续Metro UI演进、iOS小组件机制乃至现代跨端框架的渲染调度逻辑。本 阅读详情

 

 
本文主要介绍如何基于REST协议实现在iPhone和Google App Engine之间进行的通信。REST协议是一个基于HTTP协议,能够简单的实现数据的追加,更新,删除和获取。通信的数据格式采用JSON一个轻量级的数据格式。iPhone作为客户端,其主要功能是提交和获取数据。Google App Engine作为服务端,主要功能接收,保存和返回数据。

iPhone端的实现
1、JSON格式的转换
首先是解决JSON格式的转换。经过一番调查选择了TouchJSON,TouchJSON是一个开源的开发包。
TouchJSON的使用方法比较简单,能够简单的在JSON格式和NSDictionary之间进行转换。

// 将JSON格式的NSData转换成NSDictionary
NSDictionary *dictionary = [[CJSONDeserializer deserializer]
    deserialize:jsonData error:&error];
// 将NSDictionary转换成JSON格式的字符串
NSString *jsonData = [[CJSONSerializer serializer] serializeObject:dictionary];
2、数据类的定义
首先定义一个数据类,这个类主要定义了iPhone和Google App Engine之间通信时的数据。
鉴于Google App Engine对数据类的命名习惯,这里取名为MessageEntity。
MessageEntity中只定义了一个属性message,用来存放将要传送的文字内容。
另外为了方便JSON格式的转换,实现了格式化和反格式化的两个类方法。

@interface MessageEntity : NSObject {
 // 这里可以最加其它的属性,本代码主要为了示范,所以简单为主,指定义了一个属性,
 NSString *_message;
}

// 对外公开
@property (nonatomic, retain) NSString *message;

// JSON格式转换的类方法
+ (NSData *)serialize:(MessageEntity *)messageEntity;
+ (id)deserializeWithDictionary:(NSDictionary *)dictionary;

@end

@implementation MessageEntity

@synthesize message = _message;

// 将MessageEntity对象实例转换成JSON格式的数据
+ (NSData *)serialize:(MessageEntity *)messageEntity {
 NSDictionary *dictionary = [NSDictionary dictionaryWithObject:
  messageEntity.message forKey:@"message"];
 NSString *jsonString = [[CJSONSerializer serializer] serializeObject:dictionary];
 NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
 return jsonData;
}

// 将从JSON格式转换来的NSDictionary对象实例转换成MessageEntity对象实例
+ (id)deserializeWithDictionary:(NSDictionary *)dictionary {
 MessageEntity *messageEntity = [[MessageEntity alloc] init];
 messageEntity.message = [dictionary objectForKey:@"message"];
 return messageEntity;
}

- (void)dealloc {
 [_message release];
 [super dealloc];
}

@end
3、向Google App Engine端提交数据
实现起来很简单,根据REST协议,提交数据时将HTTP的Method设置为POST,在HTTP的Body里设置提交的内容,
然后就是跟普通的HTTP协议一样提交Request到指定的URL。
提交的URL是Google App Engine的地址,后面将会介绍Google App Engine端的实现。

// 指定提交的URL地址
NSURL *url = [NSURL URLWithString:@"http://tiekrr.appspot.com/rest/message.json"];
// 创建NSMutableURLRequest
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
// 设置HTTP头信息
NSString *boundary = [[NSProcessInfo processInfo] globallyUniqueString];
NSString *boundaryString = [NSString stringWithFormat:
 @"multipart/form-data; boundary=%@", boundary];
[request addValue: boundaryString forHTTPHeaderField: @"Content-Type"];
// 根据REST协议指定HTTPMethod为POST
[request setHTTPMethod:@"POST"];
// 将要提交的数据转换成JSON格式后设置为HTTPBody
[request setHTTPBody:[MessageEntity serialize:messageEntity]];
// 定义HTTP将要返回的Response对象
NSURLResponse *response = nil;
NSError *error = nil;

// 发出同步请求
NSData *result = [NSURLConnection sendSynchronousRequest:request
 returningResponse:&response error:&error];

[request release];
// 发生错误
if (error) {
 UIAlertView *errorAlertView = [[UIAlertView alloc] initWithTitle:@"Error"
  message:[error localizedDescription]
  delegate:nil cancelButtonTitle:@"Close"
  otherButtonTitles:nil];
 [errorAlertView show];
 [errorAlertView release];
}
// 返回的结果
NSString *resultString = [[NSString alloc] initWithData:result
 encoding:NSUTF8StringEncoding];
NSLog(resultString);
[resultString release];
4、从Google App Engine端获取数据
和提交一样也是利用HTTP协议提交Request到指定的URL然后从返回的Response中获取数据。
首先根据REST协议,获取数据时将HTTP的Method设置为GET即可。

// 指定提交的URL地址
NSURL *url = [NSURL URLWithString:@"http://tiekrr.appspot.com/rest/message.json"];
// 创建NSMutableURLRequest
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
// 设置HTTP头信息
NSString *boundary = [[NSProcessInfo processInfo] globallyUniqueString];
NSString *boundaryString = [NSString stringWithFormat:
 @"multipart/form-data; boundary=%@", boundary];
[request addValue: boundaryString forHTTPHeaderField: @"Content-Type"];
// 根据REST协议指定HTTPMethod为POST
[request setHTTPMethod:@"GET"];

NSURLResponse *response = nil;
NSError *error = nil;

// 发出同步请求
NSData *result = [NSURLConnection sendSynchronousRequest:request
 returningResponse:&response error:&error];

[request release];
// 发生错误
if (error) {
 UIAlertView *errorAlertView = [[UIAlertView alloc] initWithTitle:@"Error"
  message:[error localizedDescription]
  delegate:nil
  cancelButtonTitle:@"Close"
  otherButtonTitles:nil];
 [errorAlertView show];
 [errorAlertView release];
}
// 返回的结果,其中包含JSON格式的所要获取的数据
NSString *resultString = [[NSString alloc] initWithData:result
 encoding:NSUTF8StringEncoding];
NSLog(resultString);
NSData *resultData = [resultString dataUsingEncoding:NSUTF32BigEndianStringEncoding];
// 这里是获取多行数据,所以采用数组的格式
NSArray *resultArray = [[CJSONDeserializer deserializer]
 deserializeAsArray:resultData error:&error];

// 逐个解析数组中的数据然后转换成MessageEntity对象。
for (NSDictionary *dictionary in resultArray) {
 MessageEntity *messageEntity = [MessageEntity deserializeWithDictionary:dictionary];
 [_messageArray addObject:messageEntity];
}
[resultString release];

 

 

 

转自:http://hi.baidu.com/%B0%B5%D2%B9%B6%BC%BE%F4/blog/item/e08c1835941a07bbd1a2d30b.html

Gemini 3 Flash实战指南:零成本高频AI调用的工程落地 大语言模型API调用正从高成本、低频次向低成本、原子化、高吞吐演进。Gemini 3 Flash代表新一代轻量推理范式,其核心在于通过上下文精简、任务蒸馏与算力套利,在结构化输出、指令遵循、批量文本处理等高频场景中实现毫秒级响应与零计费。它不追求通用智能,而是以确定性延迟、强格式兼容性和极简接入为技术价值,广泛适用于客服工单分类、代码提交摘要、合同字段提取、发票解析等企业级自动化任务。结合Google AI Studio快速验证、Gemini CLI流水线集成与Vertex AI生产部署,开发者可将大模型真 阅读详情

相关推荐

智能体架构演进史:从明斯基到LLM的三层解耦实践

智能体(Agent)并非新兴概念,而是分布式人工智能发展中的结构性回归。其核心在于模拟人类协作式认知——多个专业化单元通过意图理解、工具调用与上下文协同完成复杂任务。技术演进的关键突破在于:大语言模型解决了语义模糊性与动态知识表示难题,现代算力与通信协议消除了历史瓶颈,而三层解耦架构(执行层、协调层、记忆层)则实现了工程可维护性与业务可扩展性的统一。当前主流框架如AutoGen、LangChain Agent和CrewAI,均围绕意图解析器、工具调用编排器、上下文压缩器与可信度评估器四大组件构建。本文聚焦生

weixin_30861797的博客 422

camunda工作流开发实战------03 hello world

一、camunda modeler流程设计器 想要开发工作流hello world ,首先得要有一个流程设计器来设计流程 camunda 提供了流程设计程序 camunda modeler 下载地址:Download The Camunda BPMN / DMN Process Modeler | Camunda 下载完成直接解压到本地就可以用啦 。 二、部署一个流程定义 1、设计一个简单的请假流程图 test_1 并保存。 2 点击下方部署 3 填写好流程定义名称 以.....

qq_31494965的博客 8170

DeepSeek一体机:软硬协同的AI平权终端

大模型本地化部署长期受限于硬件兼容性、模型服务编排与业务系统集成三大瓶颈,导致中小企业和一线业务人员难以真正用上AI能力。DeepSeek一体机通过国产化硬件预适配、INT4量化模型v4-pro工程优化、以及协议抽象层(PAL)实现Office/IDE/企业微信等多场景零代码接入,将大模型调用门槛从CUDA/PyTorch级技术能力,降低至办公软件熟练度。其核心价值不在于参数规模,而在于开箱即用的稳定性、细粒度权限治理与边缘-中心协同架构,让法律文书分析、CAD图纸合规检查、语音驱动良率归因等真实业务场景在

ctk87443的博客 363

Google App Engine JAX-RS REST服务

在本文中,您将学习如何使用JAX-RS参考实现(Jersey)创建REST服务并将其部署在Google AppEngine上。 先决条件 对于本教程,您将需要: Google AppEngine帐户 Eclipse Galileo(3.5.x) 适用于Java的Google App Engine SDK 按照此处所述安装Eclipse的Google插件(...

最佳 Java 编程 265

AI搜索范式革命:从关键词匹配到机器先知

搜索引擎正经历从‘匹配信息’到‘理解意图、生成服务’的根本性转变。其核心原理已由倒排索引、PageRank和BM25等传统统计与图谱方法,升级为基于向量语义理解、知识增强检索(KGR)和端到端生成式重排序的AI原生架构。这一技术跃迁带来了显著的价值提升:大幅降低用户认知负荷、实现搜索即服务(Search-as-a-Service)、并推动结果评估从点击率转向任务完成率。典型应用场景包括自然语言提问的精准响应、多模态内容(图文/视频/代码)的上下文感知呈现,以及嵌入式工具调用——如直接在搜索页订车、修电脑或批

weixin_34279579的博客 459

【信息科学与工程学】【控制科学】第十二篇 微型计算机控制技术01

更精确的经典模型:I1在第5周期WB结束,I2最早可在第6周期进入EX,但I2在ID阶段就需要R1,因此I2的ID需在第6周期,而I1的WB在第5周期,所以I2的ID可以紧接在第6周期,但中间仍有一个stall(因为I1的EX结果要等到MEM之后才能转发给ID?有优先级继承后,Task_L被提升优先级,不会被Task_M抢占,阻塞时间缩短为Task_L剩余执行时间(9ms),仍可能超过10ms,但可通过调整任务周期或使用中断处理缓解。电感L=10μH,输出电容C=100μF,ESR=5mΩ。

weixin_49199313的博客 8628

MuleSoft企业级AI编排:LLM集成的协议治理与安全落地

大语言模型(LLM)在企业落地的核心挑战,本质是语义智能与刚性系统之间的契约冲突。其原理在于:LLM输出具有不确定性,而ERP、CRM等核心业务系统依赖强类型、确定性接口(如SOAP、IDoc、BAPI)。技术价值体现在通过API编排平台实现协议转换、语义桥接与治理闭环——既保留LLM的自然语言理解力,又满足SOX审计、GDPR合规与服务韧性要求。典型应用场景包括财务发票摘要校验、法务合同合规审查、订单智能通知生成等需留痕、可审计、高可靠性的生产环境任务。本文聚焦MuleSoft Anypoint Plat

weixin_30363981的博客 420

单细胞专题(1) | 单细胞转录组研究样本准备指南(上)

单细胞RNA测序(scRNA-seq)是目前最前沿,能进行大规模实验的转录组研究技术,为理解细胞组成和动态生物学过程提供了很多新的见解。单细胞研究已经为我们理解发育过程,老化和疾病(如癌症)等提供了大量数据。在这里,小编主要就前期的样本准备与保存需注意问题给大家进行讲解,以备大家在不同的研究场景和研究背景下,走好单细胞转录组学研究的第一步。

bioyigene的博客 4229

容器技术发展史与Docker核心架构

在理解 Docker 之前,先弄清三个基础概念。物理机:实际的服务器或计算机,相对于虚拟机而言的实体计算机的称呼。它提供给虚拟机以硬件环境,有时也称为"宿主"或"寄主"。虚拟化:通过虚拟化技术将一台计算机虚拟为多台逻辑计算机,每个逻辑计算机可运行不同的操作系统,且应用程序可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。容器化。

2301_78670085的博客 484

树莓派小车:智能捡球小车——Q宝

在遇到第一个直角右转口后,进入阶段二,阶段二是智能小车减速,因为速度过快可能导致车头下方的检测出现小毛病,小车进入第一个左拐路口,增加左转时间,然后直行,到横线处,小车停止,进入阶段三,小车先识别前方的球类,然后倒车到拐口处,原地右转,之后的识别也是类似的操作,随后有一个简单的避障功能,进行球类识别测试时,在本地测试效果良好,但是投入实际应用中时,受到光线等因素的影响,识别球类的能力大大下降。小车摄像头精度不够,视角较小,在识别人脸时,需要不断移动人脸照片,让摄像头能够抓取人脸。在第一阶段的循迹过程中,

dfbsszxzv的博客 1932

Twincat Scopeview录波中的Ringbuffer设置技巧与常见问题解决

本文深入解析了倍福Twincat Scopeview录波功能中Ringbuffer(环形缓冲区)的核心设置技巧与常见问题解决方案。针对数据丢失、触发时机不准等痛点,详细阐述了缓冲区大小、预触发样本、采样率等关键参数的优化配置,并提供了多通道同步、自动诊断等实战应用指南,帮助工程师高效捕捉和分析PLC数据。

rainy的博客 845

大模型系统开发能力体系

本文系统梳理了大模型开发的核心知识体系,分为底层认知层和模型演进层。底层认知层涵盖机器学习基础概念(张量、梯度、链式法则、概率分布)和LLM关键参数(Token、上下文窗口、温度等控制参数)。模型演进层分析主流架构发展:CNN通过局部感受野处理图像,RNN/LSTM用于序列建模但存在并行性差等问题,Transformer凭借自注意力机制实现全局依赖建模成为当前主流。全文提供了参数组合策略等技术细节,为开发者构建了从理论基础到实践应用的能力框架。

weixin_45130169的博客 1272

手把手教你用UNet实现轨道缺陷检测(附RSDDs数据集下载与完整代码)

本文详细介绍了如何使用UNet模型实现轨道缺陷检测,包括RSDDs数据集的下载与处理、UNet架构的改进与优化、训练策略设计以及模型部署的全流程。通过实战案例,展示了如何利用深度学习技术提升工业质检效率,特别适合从事工业缺陷检测和图像处理的开发者参考。

dapp9builder的博客 747

IDE简记:2026更新

主流开发IDE对比摘要: 官方指定IDE: Android Studio:谷歌官方安卓开发工具,支持全生态设备,内置SDK管理器和模拟器 Xcode:苹果独家开发工具,仅支持macOS,集成Swift开发环境 DevEco Studio:华为鸿蒙官方IDE,支持多设备协同开发 通用流行IDE: Visual Studio:微软全功能IDE,支持.NET/C++等,分免费和付费版本 VS Code:轻量跨平台编辑器,强大插件生态,AI编码助手支持丰富 IntelliJ IDEA:Java/Kotlin首选ID

生活在别处 2043

一文详解AUTOSAR COM ComSignal结构体

ComSignalLength指定信号的长度,以字节为单位,影响数据的解析范围和精度。比如车速信号若为UINT16类型,ComSignalLength=16。这里需要注意必须ComSignalLength与ComSignalType匹配(比如FLOAT32类型需配置ComSignalLength=32),超出实际物理值范围时需配置缩放(Scaling)参数。ComSignalType定义信号的物理数据类型,决定如何解析原始字节数据。

menghuyouyou的博客 942

【ARM CoreLink 系列 4 -- NIC-400 控制器详细介绍】

正常情况下,一个NIC的实现,可以包含一百多个master和几十个slave,每个master和每个slave都会有一些寄存器,这些寄存器可以被 programming,实际实践中就会对 AMIB 或者 ASIB 或者 IB,当它需要具有 programming的时候,给它指定一个node number。为什么指定Node Number呢?首先,从CPU的角度,它需要有一个1M对齐的地址空间,在这1M地址空间上,对每个ASIB或者AMIB这样的接口给它一个node number以后,

CodingCos的博客 5241

Docker 学习:术语、使用、Compose、Swarm

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

freeking101的博客 6167

【个人学习总结】CRC校验原理及实现

CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。 ..................

星Yeah 的博客 7967

并行分布式框架:Celery、rq、funboost

Celery是一个异步任务的调度工具,也可以叫做 "分布式任务队列(Distributed Task Queue)"。

freeking101的博客 5万+

【3天快速入门WPF】从小白到新手入门教程

嘿,小伙伴们!如果你已经有一定的C#开发基础,但想快速掌握WPF开发,达到企业级水准,那接下来的这个三天快速入门计划绝对适合你!虽然听起来有点挑战,但别担心,只要跟着这个高强度、结构化的学习计划,你一定能搞定它。首先,我们得搞清楚,WPF的核心知识点到底有哪些。要想达到企业级开发水准,XAML、数据绑定、MVVM、控件使用、命令系统、样式模板这些统统都得拿下。听起来是不是有点多?别急,我们把任务分解到三天里,每天安排合理的内容,保证理论和实践相结合,让你学得扎实又高效。

Zy100Papa的博客 1422

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

医疗预约自动化系统:用FHIR+Twilio构建高ROI提醒方案

医疗预约爽约是基层诊所普遍面临的运营痛点,本质源于患者行为管理缺失与数据流动断层。其底层原理涉及健康信息互操作标准(FHIR)实时同步、双向短信交互触发承诺一致性心理机制、多时点触达的时间敏感调度,以及基于队列对比的ROI归因分析。该技术方案的核心价值在于将传统人工电话提醒升级为可度量、可审计、可扩展的数字运营基础设施,显著降低PHI泄露风险并提升HIPAA合规性。典型应用场景包括家庭医生诊所、专科门诊及社区健康中心的预约管理优化。本文聚焦于一个经六家诊所验证的轻量级落地实现,涵盖EHR集成、Twilio双

weixin_33805743的博客 384

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

如何将 iPhone 备份到 iCloud?

iCloud 是苹果公司提供的云存储服务,可帮助 iPhone 用户将重要数据保存到云端。启用 iCloud 云备份后,即使您的 iPhone 丢失、损坏或需要恢复出厂设置,您也可以使用之前创建的备份将受支持的数据恢复到设备上。帮助保存设备设置、应用程序数据、主屏幕布局、消息历史记录和其他信息,降低手机丢失或损坏时数据丢失的风险。启用 iCloud 自动备份后,您的 iPhone 会在满足所需条件时自动创建备份,这样您就不必每次都手动操作。

Digitally的博客 246

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Dart/Flutter `package:http`:从发请求到局部替换 HTTP Client

本文详解 Flutter 中 package:http 的核心概念,解析 Client、BaseClient、send() 拦截机制及 runWithClient 的原理。通过 _AuthingQrDiagnosticClient 示例,揭示如何通过重写 send() 拦截请求、包装响应流,并利用 Dart Zone 实现客户端临时替换。最终说明 Authing SDK 请求被拦截的原因:runWithClient 依托 Zone 上下文注入自定义客户端,实现全局请求拦截与日志记录,无需显式传参。

侯仕奇的博客 234

近 900GB 的 iPhone 搬家:有线要 14 小时,换成无线反而预估 7 小时?

家里几部 iPhone 需要重新安排数据,原以为只是插根线、点几下屏幕的事,没想到折腾下来,竟给自己上了一堂 USB、Wi-Fi 和电源管理的实战课。先说结果:iPhone 14 Pro Max 迁移到恢复出厂设置的 iPhone 16 Pro Max,第一次走 USB-C 转 Lightning 有线连接,耗时约 14 小时。后来改走「快速开始」无线直接迁移,手机显示预估约 7 小时。

Saniffer的博客 302
上一篇: NSMutableURLRequest,在POST方式下传递参数
下一篇: 怎么让一个UIImageView响应点击事件呢
Robincui2011
博客等级 码龄15年 21粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值