Alamofire的使用教程

小红书私信接口与Hook技术实战:微信跳转卡片的合规与破解之道 本文深入探讨了小红书私信接口与Hook技术的实战应用,重点解析了微信跳转卡片的合规使用与破解方法。通过官方私信接口的合规玩法与Xposed框架的Hook技术对比,为开发者提供了技术选型指南和实战建议,帮助实现高效的用户跳转与转化。 阅读详情

环境:Alamofire 4, Xcode 8.2, iOS 10, and Swift 3.
Alamofire是一个基于HTTP的网络请求库,适用于iOS和OSX,针对apple的基本网络请求库作了封装,简化网络请求的复杂逻辑。
Alamofire提供了request/response方法,JSON参数形式,序列化功能,以及authentication等许多特性。在本篇文章中,你可以学到通过Alamofire实现基本的数据上传和下载。
首先,下载基本的空项目:https://koenig-media.raywenderlich.com/uploads/2016/12/PhotoTagger-starter-1.zip
这个项目名称叫做PhotoTagger,当你完成了这个项目,会实现以下的效果:当你从照片库选择一张照片,并且上传到我们指定的第三方服务器,就可以实现照片的智能识别,包含照片所包含的标签,和图片的合成颜色:
这里写图片描述
下载完项目,build运行后你可以看到下面的效果。
这里写图片描述
点击select Photo按钮,当前view的背景会换成你选择的图片的样子

Imagga 的API

Imagga是一个图片识别平台,为开发者免费提供了图片的上传获取API,有兴趣可以看看Imagga平台的这个小项目。https://imagga.com/auto-tagging-demo?url=https://imagga.com/static/images/tagging/vegetables.jpg
如果想使用Imagga,首页需要注册成为其平台的开发者,填下一下的表格即可https://imagga.com/auth/signup/hacker
当填完后这个表格后,点击确定进入主页面,能看到这个页面
这里写图片描述
注意Authorization 这个部分,在以后的网络请求中会有用到。
这里是imagga的文档详细使用说明,需要的可以看看。http://docs.imagga.com/

安装 Dependencies

创建cocoaPod环境,创建Podfile文件,如下

platform :ios, '10.0'

inhibit_all_warnings!
use_frameworks!

target 'PhotoTagger' do
  pod 'Alamofire', '~> 4.2.0'
end

然后在终端执行以下指令:

pod install

如果你的电脑上没有安装cocoaPods环境,查看这篇文章http://www.raywenderlich.com/97014/use-cocoapods-with-swift
关闭当前的项目,并且打开项目PhotoTagger.xcworkspace. 运行后发现还开始的页面都一样,没有变化,下面开始正式进入网络请求的介绍部分。

开始一个Alamofire请求

分为三个部分,
upload:上传multipart files和stream,file 或data
download:下载files或者重新开始一个已经开始的网络请求
,request:每一个不含文件上传和下载的Http请求。

上传 Files

打开ViewController.swift 并且引进头文件

import Alamofire

这样就可以使用Alamofire提供的function了
接着:添加一个extension到文件的最后面

// Networking calls
extension ViewController {
  func upload(image: UIImage,
              progressCompletion: @escaping (_ percent: Float) -> Void,
              completion: @escaping (_ tags: [String], _ colors: [PhotoColor]) -> Void) {
    guard let imageData = UIImageJPEGRepresentation(image, 0.5) else {
      print("Could not get JPEG representation of UIImage")
      return
    }
  }
}

这一步上传我们本地的图片到imagga的服务器,同时会返回给我们一个图片。

然后,在imagePickerController(_:didFinishPickingMediaWithInfo:)方法中的给imageView赋值image时添加以下代码:

// 1
takePictureButton.isHidden = true
progressView.progress = 0.0
progressView.isHidden = false
activityIndicatorView.startAnimating()

upload(
  image: image,
  progressCompletion: { [unowned self] percent in
    // 2
    self.progressView.setProgress(percent, animated: true)
  },
  completion: { [unowned self] tags, colors in
    // 3
    self.takePictureButton.isHidden = false
    self.progressView.isHidden = true
    self.activityIndicatorView.stopAnimating()

    self.tags = tags
    self.colors = colors

    // 4
    self.performSegue(withIdentifier: "ShowResults", sender: self)
  })

所有的alamofire的请求都是异步的,这样就意味着UI的刷新也是异步的,下面介绍每一步的含义:
1. 隐藏上传按钮,并且展示上传的进度和activity view
2. 上传文件的时候通过progress handler 来更新上传进度条:
3.当上传完成之后,通过completion handler来更新UI
4.当上传完成之后,通过storyBoard来实现跳转。
然后 在upload(image:progressCompletion:completion:) 的image转化之后添加以下代码:

Alamofire.upload(
  multipartFormData: { multipartFormData in
    multipartFormData.append(imageData,
                             withName: "imagefile",
                             fileName: "image.jpg",
                             mimeType: "image/jpeg")
  },
  to: "http://api.imagga.com/v1/content",
  headers: ["Authorization": "Basic xxx"],
  encodingCompletion: { encodingResult in
  }
)

记着更换Basic xxx 成你自己的。
然后,在encodingCompletion的闭包里面添加以下代码:

switch encodingResult {
case .success(let upload, _, _):
  upload.uploadProgress { progress in
    progressCompletion(Float(progress.fractionCompleted))
  }
  upload.validate()
  upload.responseJSON { response in
  }
case .failure(let encodingError):
  print(encodingError)
}

然后。在upload.responseJSON:添加以下代码

// 1.
guard response.result.isSuccess else {
  print("Error while uploading file: \(response.result.error)")
  completion([String](), [PhotoColor]())
  return
}

// 2.
guard let responseJSON = response.result.value as? [String: Any],
  let uploadedFiles = responseJSON["uploaded"] as? [[String: Any]],
  let firstFile = uploadedFiles.first,
  let firstFileID = firstFile["id"] as? String else {
    print("Invalid information received from service")
    completion([String](), [PhotoColor]())
    return
}

print("Content uploaded with ID: \(firstFileID)")

// 3.
completion([String](), [PhotoColor]())

这里分步介绍每一步的含义:
1. 查看请求是否成功,如果失败,打印失败信息,并且调用completion handler。
2. 分离每一部分的数据,并查看返回的状态是否有效,如果有错误,打印失败信息,并且调用completion handler。
3. 更新UI
运行项目,选择一张图片上传,可以在打印台看到以下信息:
图片
这个时候,已经完成了基本的数据上传

数据下载

接下来就是讲刚刚上传照片的分析数据下载下来。
在ViewController的upload(image:progress:completion:):中添加以下代码

func downloadTags(contentID: String, completion: @escaping ([String]) -> Void) {
  Alamofire.request(
    "http://api.imagga.com/v1/tagging",
    parameters: ["content": contentID],
    headers: ["Authorization": "Basic xxx"]
  )
  .responseJSON { response in
    guard response.result.isSuccess else {
      print("Error while fetching tags: \(response.result.error)")
      completion([String]())
      return
    }

    guard let responseJSON = response.result.value as? [String: Any] else {
      print("Invalid tag information received from the service")
      completion([String]())
      return
    }

    print(responseJSON)
    completion([String]())
  }
}

然后upload(image:progress:completion:) 替换completion handler为以下代码

self.downloadTags(contentID: firstFileID) { tags in
  completion(tags, [PhotoColor]())
}

运行项目,上传你的文件并且查看控制台信息。如下图:
这里写图片描述
然后返回downloadTags(contentID:completion:) 并且替换.responseJSON
下的代码为以下代码

// 1.
guard response.result.isSuccess else {
  print("Error while fetching tags: \(response.result.error)")
  completion([String]())
  return
}

// 2.
guard let responseJSON = response.result.value as? [String: Any],
  let results = responseJSON["results"] as? [[String: Any]],
  let firstObject = results.first,
  let tagsAndConfidences = firstObject["tags"] as? [[String: Any]] else {
    print("Invalid tag information received from the service")
    completion([String]())
    return
}

// 3.
let tags = tagsAndConfidences.flatMap({ dict in
  return dict["tag"] as? String
})

// 4.
completion(tags)

运行项目,上传一张图片就可以看到以下效果:
这里写图片描述
下面开始获取图片的colors的接口,同样的:
在ViewController的downloadTags(contentID:completion:):下面添加以下代码

func downloadColors(contentID: String, completion: @escaping ([PhotoColor]) -> Void) {
  Alamofire.request(
    "http://api.imagga.com/v1/colors",
    parameters: ["content": contentID],
    // 1.
    headers: ["Authorization": "Basic xxx"]
  )
  .responseJSON { response in
    // 2.
    guard response.result.isSuccess else {
      print("Error while fetching colors: \(response.result.error)")
      completion([PhotoColor]())
      return
    }

    // 3.
    guard let responseJSON = response.result.value as? [String: Any],
      let results = responseJSON["results"] as? [[String: Any]],
      let firstResult = results.first,
      let info = firstResult["info"] as? [String: Any],
      let imageColors = info["image_colors"] as? [[String: Any]] else {
        print("Invalid color information received from service")
        completion([PhotoColor]())
        return
    }

    // 4.
    let photoColors = imageColors.flatMap({ (dict) -> PhotoColor? in
      guard let r = dict["r"] as? String,
        let g = dict["g"] as? String,
        let b = dict["b"] as? String,
        let closestPaletteColor = dict["closest_palette_color"] as? String else {
          return nil
      }

      return PhotoColor(red: Int(r),
                        green: Int(g),
                        blue: Int(b),
                        colorName: closestPaletteColor)
    })

    // 5.
    completion(photoColors)
  }
}

最后在upload(image:progress:completion:)的completion handler下面添加以下代码:

self.downloadTags(contentID: firstFileID) { tags in
  self.downloadColors(contentID: firstFileID) { colors in
    completion(tags, colors)
  }
}

运行项目,并且点击colors 按钮可以看到以下效果。
这里写图片描述

项目地址:https://github.com/LINDreaming/DailyTools
原文地址:https://www.raywenderlich.com/147086/alamofire-tutorial-getting-started-2

RU.EXE实用指南:从基础操作到高级调试技巧 本文是RU.EXE(RW Everything)的实用指南,详细介绍了这款硬件调试工具从基础操作到高级技巧的全过程。文章阐述了RU.EXE作为直接读写硬件寄存器、内存和PCI配置空间的强大工具,如何帮助硬件工程师和开发人员高效进行底层系统调试与故障排查,并强调了安全操作的重要性。 阅读详情

相关推荐

EMC案例:解决千兆网口RTL8211F EMI问题

摘要:本文分析了Amlogic S812平台OEM项目中RTL8211F-CG千兆网卡EMI辐射超标问题。发现百兆测试时25MHz时钟有3dB余量,但千兆125MHz时钟导致超标。问题根源包括:未关闭PHY芯片悬空CLKOUT引脚、TX/RXCLK端RC位置错误、包地不完整及参考地缺失。解决方案涉及软件关闭无用时钟、优化RC布局、加强包地与打孔、调整共模电感位置,并在HDMI 3.3V加磁珠。关键结论指出千兆网125MHz时钟需严格包地打孔,且RC取值需平衡EMI与通信性能。

电子绿洲的博客 1279

Alamofire 框架封装与使用

Alamofire 框架封装与使用

Hanyang Li的专栏 2687

主流仿真软件Sigrity/HFSS/Siwave/Hyperlynx/ADS差异

在电子设计自动化(EDA)领域,各种仿真软件如Cadence Sigrity、Mentor Graphics的HyperLynx、Keysight的ADS以及ANSYS的SIwave等,都广泛应用于不同的应用场景中。综上所述,这些EDA仿真软件在各自的应用场景中发挥着重要作用,帮助工程师在设计阶段就能够评估和优化电子产品的性能,提高设计的可靠性和效率。:Sigrity由全球最大的EDA公司Cadence推出,Cadence还推出了Orcad和Allegro等著名软件。:由安捷伦(现是德科技)公司开发。

Geektec的专栏 9406

Alamofire 使用教程

Alamofire 使用教程 【免费下载链接】Alamofire Alamofire/Alamofire: Alamofire 是一个用于 iOS 和 macOS 的网络库,提供了 RESTful API 的封装和 SDK,可以用于构建网络应用程序和 Web 服务。 ...

gitblog_00023的博客 681

GNSS气象学入门:从ZTD到PWV的水汽反演全流程解析(含精度评估)

本文详细解析了GNSS气象学中从ZTD到PWV的水汽反演全流程,包括基础概念、反演原理、数据处理步骤及精度评估方法。通过PRIDE软件和MATLAB代码示例,展示了如何高效提取ZTD数据并结合ERA5气象数据进行PWV计算,为气象研究和业务应用提供了实用指南。

weixin_28707365的博客 573

大语言模型原理与工程实践:手把手教你训练 7B 大语言模型 自动化训练框架

近年来,大语言模型(Large Language Models,LLMs)在自然语言处理领域取得了突破性进展。从GPT-3到ChatGPT,再到最新的GPT-4,这些模型展现出了惊人的语言理解和生成能力,引发了学术界和产业界的广泛关注。然而,训练如此庞大的模型不仅需要海量的数据和计算资源,还需要复杂的工程实践和优化技巧。本文将深入探讨大语言模型的原理,并以7B参数规模的模型为例,详细介绍如何构建一个自动化训练框架,使读者能够亲自动手训练自己的大语言模型。

AI天才研究院 1923

Alamofire常见GET/POST等请求方式的使用,响应直接为json

Alamofire是一个基于Swift语言开发的优秀网络请求库。它封装了底层的网络请求工作,提供了更简单、更易用的接口,大大简化了网络请求代码的编写。Alamofire提供了一套优雅且易于理解的API,使得开发者可以轻松发起各种类型的HTTP请求。它支持GET、POST、PUT、DELETE等常用的请求方法,并且提供了丰富的参数设置选项。Alamofire提供了强大的响应处理功能,支持数据解析、文件上传和下载等常见需求。它基于Swift的特性和语法,代码简洁、可读性强,易于维护和扩展。

2848

UCIE Specification详解(二)

UCIe架构概述。

Crazzy_M的博客 3304

【iOS开发】Alamofire框架的使用一 —— 基本用法

这篇文章是 Alamofire 5.0 以前的文档,最新文档请查看:Alamofire 5 的使用 - 基本用法 对于使用Objective-C的开发者,一定非常熟悉AFNetworking这个网络框架。在苹果推出的Swift之后,AFNetworking的作者专门用Swift来编写一个类似AFNetworking的网络框架,称为Alamofire。Alamofire地址 >> 我分两篇文章介绍如何使用Alamofire框架。文章的内容主要是翻译Alamofire的readme。第二篇文章.

Gabriel的专栏 1674

使用 MATLAB/Simulink 对风光互补发电系统进行建模

随着全球对清洁能源的需求日益增长,风力发电和光伏发电作为两种主要的可再生能源形式,在电力供应中的占比越来越高。然而,由于风电和光伏的间歇性和不确定性,单独依赖其中任何一种能源都会给电网带来挑战。因此,风光互补发电系统(Wind-PV Hybrid System)应运而生,通过合理配置风力发电机和光伏电池板的数量,可以有效提高系统的稳定性和可靠性。此外,为了确保整个电力系统的安全稳定运行,还需要研究风光互补发电系统与主网之间的协调调度策略。本教程将详细介绍如何使用。

amy_mhd的博客 118

ARM交叉编译gdbserver并远程在线调试

arm-linux平台。5、生成完整的makefile,新建full_install,执行 ./configure --target=arm-linux-gnueabihf --host=arm-linux-gnueabihf --program-prefix=arm-linux-gnueabihf- CC=arm-linux-gnueabihf-gcc --prefix=/home/geyuxi/Documents/full_install。如果--host和--build不同,是交叉编译;

wangjie36的博客 3168

Alamofire-Synchronous 使用教程

Alamofire-Synchronous 使用教程 项目介绍 Alamofire-Synchronous 是一个基于 Alamofire 的扩展库,用于在 Swift 中进行同步网络请求。它允许开发者在没有回调的情况下直接获取网络请求的结果,这在某些场景下非常有用,尤其是在需要同步执行多个网络请求时。 项目快速启动 安装 首先,你需要通过 CocoaPods 安装 Alamofire-Synch...

gitblog_01181的博客 449

SKILL 是什么?怎么做?五分钟 带你从入门到精通

skill-creator 是 Anthropic 官方开源的“元技能”——一个专门用来创建 Skill 的 Skill。你只需要用自然语言描述想要什么功能,它会自动生成。从更宏观的视角看,Skills 的出现标志着 AI 编程的一次范式转变。在传统的 AI 编程中,代码是确定性的:1 是 1,2 是 2。但到了大模型时代,代码变得不确定——你不知道模型会输出什么,不知道它会不会突然删掉几行代码。这种不确定性让很多开发者感到不安。Skills 把这套逻辑又拉了回来。

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 642

Alamofire网络库基础教程:使用 Alamofire 轻松实现 Swift 网络请求(一)

本章节由CocoaChina翻译组成员星夜暮晨(博客)翻译自raywenderlich:Beginning Alamofire Tutorial,敬请勘误。 AFNetworking是 iOS 和 OS X 上最受欢迎的第三方库之一。它曾在我们的2012年的读者评选中荣获2012年度最佳 iOS 库称号。它同样也在 Github 上面获得了14000多个 stars 和4000多

sunyazhou13的专栏 1163

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Alamofire网络库基础教程:使用 Alamofire 轻松实现 Swift 网络请求

本章节由CocoaChina翻译组成员星夜暮晨(博客)翻译自raywenderlich:Beginning Alamofire Tutorial,敬请勘误。 AFNetworking是 iOS 和 OS X 上最受欢迎的第三方库之一。它曾在我们的2012年的读者评选中荣获2012年度最佳 iOS 库称号。它同样也在 Github 上面获得了14000多个 stars 和4000多

Companion_1314的专栏 1012

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Alamofire-Synchronous 项目使用教程

Alamofire-Synchronous 项目使用教程 1、项目的目录结构及介绍 Alamofire-Synchronous 项目的目录结构相对简单,主要包含以下几个部分: Alamofire-Synchronous.xcodeproj: Xcode 项目文件,用于打开和管理项目。 Alamofire-Synchronous: 项目的主要源代码目录。 Source: 包含项目的源代码文件。 ....

gitblog_00810的博客 458

Alamofire网络库基础教程

Alamofire网络库基础教程

samuelandkevin的专栏 344

Alamofire网络库基础教程(一)

本章节由CocoaChina翻译组成员星夜暮晨(博客)翻译自raywenderlich:Beginning Alamofire Tutorial,敬请勘误。 AFNetworking是 iOS 和 OS X 上最受欢迎的第三方库之一。它曾在我们的2012年的读者评选中荣获2012年度最佳 iOS 库称号。它同样也在 Github 上面获得了14000多个 stars 和4000多

weixhe的专栏 1174

Alamofire网络库进阶教程

本章节由CocoaChina翻译组成员星夜暮晨(博客)翻译自raywenderlich:Intermediate Alamofire Tutorial,敬请勘误。 欢迎回到我们的 Alamofire 网络库使用教程,本文是此教程的第二部分,同时也是最后一个部分。 在教程的第一部分中,我们学习了 Alamofire 的一些基本用法,比如说发送 GET 请求、传递参数、创建请求路由以及

Snow的博客 448

Alamofire网络库进阶教程(课程二)

本章节由CocoaChina翻译组成员星夜暮晨(博客)翻译自raywenderlich:Intermediate Alamofire Tutorial,敬请勘误。 欢迎回到我们的 Alamofire 网络库使用教程,本文是此教程的第二部分,同时也是最后一个部分。 在教程的第一部分中,我们学习了 Alamofire 的一些基本用法,比如说发送 GET 请求、传递参数、创建请求路由以及

weixhe的专栏 506

Alamofire网络库进阶教程(二)

本章节由CocoaChina翻译组成员星夜暮晨(博客)翻译自raywenderlich:Intermediate Alamofire Tutorial,敬请勘误。 欢迎回到我们的 Alamofire 网络库使用教程,本文是此教程的第二部分,同时也是最后一个部分。 在教程的第一部分中,我们学习了 Alamofire 的一些基本用法,比如说发送 GET 请求、传递参数、创建请求路由以及

sunyazhou13的专栏 1180
上一篇: Swift加载带导航条的WebView
下一篇: iOS应用内跳转到系统设置页面
Limo._
博客等级 码龄12年 6粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值