{"id":15037437,"url":"https://github.com/meniny/fire","last_synced_at":"2025-05-07T07:20:24.301Z","repository":{"id":56911281,"uuid":"88749449","full_name":"Meniny/Fire","owner":"Meniny","description":"🔥A delightful HTTP/HTTPS networking framework for iOS/macOS/watchOS/tvOS platforms written in Swift.","archived":false,"fork":false,"pushed_at":"2019-04-06T08:22:56.000Z","size":1287,"stargazers_count":242,"open_issues_count":1,"forks_count":11,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-04-18T01:48:04.427Z","etag":null,"topics":["cocoapods","fire","http","https","ios","mac","macos","macosx","multipartform","network","networking","osx","python-requests","request","swift","swift-3","swift3","tvos","watchos"],"latest_commit_sha":null,"homepage":"https://meniny.cn/Fire/","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Meniny.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-04-19T13:37:44.000Z","updated_at":"2024-08-13T07:29:05.000Z","dependencies_parsed_at":"2022-08-20T20:20:37.167Z","dependency_job_id":null,"html_url":"https://github.com/Meniny/Fire","commit_stats":null,"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Meniny%2FFire","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Meniny%2FFire/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Meniny%2FFire/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Meniny%2FFire/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Meniny","download_url":"https://codeload.github.com/Meniny/Fire/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252831440,"owners_count":21810806,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cocoapods","fire","http","https","ios","mac","macos","macosx","multipartform","network","networking","osx","python-requests","request","swift","swift-3","swift3","tvos","watchos"],"created_at":"2024-09-24T20:34:37.918Z","updated_at":"2025-05-07T07:20:24.273Z","avatar_url":"https://github.com/Meniny.png","language":"Swift","readme":"\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://ooo.0o0.ooo/2017/07/20/5970669291074.png\" alt=\"Fire\"\u003e\n  \u003cbr/\u003e\u003ca href=\"https://cocoapods.org/pods/Fire\"\u003e\n  \u003cimg alt=\"Version\" src=\"https://img.shields.io/badge/version-3.3.5-brightgreen.svg\"\u003e\n  \u003cimg alt=\"Author\" src=\"https://img.shields.io/badge/author-Meniny-blue.svg\"\u003e\n  \u003cimg alt=\"Build Passing\" src=\"https://img.shields.io/badge/build-passing-brightgreen.svg\"\u003e\n  \u003cimg alt=\"Swift\" src=\"https://img.shields.io/badge/swift-4.0%2B-orange.svg\"\u003e\n  \u003cbr/\u003e\n  \u003cimg alt=\"Platforms\" src=\"https://img.shields.io/badge/platform-macOS%20%7C%20iOS%20%7C%20watchOS%20%7C%20tvOS-lightgrey.svg\"\u003e\n  \u003cimg alt=\"MIT\" src=\"https://img.shields.io/badge/license-MIT-blue.svg\"\u003e\n  \u003cbr/\u003e\n  \u003cimg alt=\"Cocoapods\" src=\"https://img.shields.io/badge/cocoapods-compatible-brightgreen.svg\"\u003e\n  \u003cimg alt=\"Carthage\" src=\"https://img.shields.io/badge/carthage-working%20on-red.svg\"\u003e\n  \u003cimg alt=\"SPM\" src=\"https://img.shields.io/badge/swift%20package%20manager-working%20on-red.svg\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n***\n\n* [English](#Introduction)\n* [中文](#中文介绍)\n* [⽇本語](#⽇本語)\n\n# Introduction\n\n## What's this?\n\n`Fire` is a delightful HTTP/HTTPS networking framework for iOS/macOS/watchOS/tvOS platform written in Swift and inspired by [Python-Requests: HTTP for Humans](http://docs.python-requests.org/en/master/).\n\nFire was written for humans to read, and incidentally, for machines to execute :)\n\n## Features\n\n- [x] Chainable Request / Response Methods\n- [x] Upload File / Data / MultipartFormData\n- [x] HTTP Basic Authorization\n- [x] TLS Certificate and Public Key Pinning\n- [x] Comprehensive Unit and Integration Test Coverage\n- [x] Synchronously/Asynchronously Request\n- [x] Timeouts\n- [x] Custom Cache Policy\n- [x] form (`x-www-form-encoded`)/JSON HTTP body\n\n## Requirements\n\n* iOS 8.0+\n* macOS 10.10+\n* watchOS 2.0+\n* tvOS 9.0+\n* Xcode 8 with Swift 3\n\n## Dependency\n\n* [Jsonify](https://github.com/Meniny/Jsonify)\n\n## Installation\n\n#### CocoaPods\n\n```ruby\npod 'Fire'\n```\n\n## Contribution\n\nYou are welcome to fork and submit pull requests.\n\n## License\n\n`Fire` is open-sourced software, licensed under the `MIT` license.\n\n## Usage\n\nTo send a request with `Fire`, you need to do 3 steps.\n\nFirst, build up a Fire object:\n\n```swift\nlet f = Fire.build(HTTPMethod: .GET, url: \"https://yourdomain.com/get?l=zh\")\n```\n\nThen, config the Fire object:\n\n```swift\nf.setParams([\"key\": \"value\"])\nf.setFiles([file])\nf.setHTTPHeaders([\"Accept\": \"application/json\"])\nf.setBasicAuth(\"user\", password: \"pwd!@#\")\nf.setHTTPBody(raw: Data)\nlet certData = NSData(contentsOfFile: NSBundle.mainBundle().pathForResource(\"FireDemo\", ofType: \"cer\")!)!\nf.setSSLPinning(localCertData: certData) {\n    print(\"Warning: Under Man-in-the-middle attack!!\")\n}\nf.onError({ (resp, error) -\u003e Void in\n    print(\"Error: Network offline!\")\n})\n```\n\nFinally, fire up:\n\n```swift\nf.fire { (json, resp) -\u003e Void in\n    print(json[\"arg\"][\"key\"].stringValue)\n}\n\n// or\n\nf.fireForJSON { (json, resp) -\u003e Void in\n    print(json[\"arg\"][\"key\"].stringValue)\n}\n\n// or\n\nf.fireForString { (str, resp) -\u003e Void in\n    print(str)\n}\n\n// or\n\nf.fireForData { (data, resp) -\u003e Void in\n    print(\"Success\")\n}\n```\n\nIf you want to cancel it:\n\n```swift\n// cancel:\nf.onCancel {\n  print(\"Canceled\")\n}\nf.cancel()\n// or:\nf.cancel {\n   print(\"Canceled\")\n}\n```\n\nUse `Fire.Dispatch` if you want to send requests synchronously:\n\n```swift\nlet f = Fire.build(HTTPMethod: .GET, url: api.stringValue, timeout: timeout, dispatch: .synchronously)\n```\n\n`Fire.API`:\n\n```swift\nopen class func FireAPI1() {\n    Fire.API.baseURL = FireDemo.BASEURL\n    let api = Fire.API(appending: \"get.php\", HTTPMethod: .GET, successCode: .success)\n    Fire.request(api: api, params: [:], timeout: 0, callback: { (json, resp) in\n        if let status = resp?.statusCode {\n            if status == api.successCode.rawValue {\n                // ...\n            }\n        }\n    }) { (error) in\n        print(error.localizedDescription)\n    }\n}\n\nopen class func FireAPI2() {\n    Fire.API.baseURL = FireDemo.BASEURL\n    let api = Fire.API(appending: \"get.php\", HTTPMethod: .GET, successCode: .success)\n    api.requestJSON(params: [\"user\": \"Elias\"], callback: { (json, resp) in\n        if let status = resp?.statusCode {\n            if status == api.successCode.rawValue {\n                // ...\n            }\n        }\n    }) { (error) in\n        print(error.localizedDescription)\n    }\n}\n\nopen class func FireAPI3() {\n    Fire.API.baseURL = FireDemo.BASEURL\n    let api = Fire.API(appending: \"get.php\", HTTPMethod: .GET, headers: [\"Content-Type\": \"text/json\"], successCode: .success)\n    api.requestJSON(params: [\"userid\": \"1232\"], headers: [\"Device\": \"iOS\"], timeout: 60, dispatch: .asynchronously, callback: { (json, resp) in\n        if let status = resp?.statusCode {\n            if status == api.successCode.rawValue {\n                // ...\n            }\n        }\n    }) { (error) in\n        print(error.localizedDescription)\n    }\n}\n```\n\n# 中文介绍\n\n## 这是什么?\n\n`Fire` 一个使用 Swift 书写的轻量级 iOS/macOS/watchOS/tvOS 平台 HTTP/HTTPS 网络框架，深受 [Python-Requests: HTTP for Humans](http://docs.python-requests.org/en/master/) 启发。\n\nFire 为了更好的可读性而生，碰巧还可以运行 :)\n\n## 特性\n\n- [x] 链式调用的请求和响应方法\n- [x] 上传文件和数据\n- [x] 支持 HTTP Basic 认证\n- [x] 支持 SSL Pinning\n- [x] 全面的单元和集成测试覆盖\n- [x] 同步/异步请求\n- [x] 超时\n- [x] 自定义缓存策略\n- [x] 支持 form (`x-www-form-encoded`)/JSON HTTP 请求体\n\n## 环境\n\n* iOS 8.0+\n* macOS 10.10+\n* watchOS 2.0+\n* tvOS 9.0+\n* Xcode 8 及 Swift 3\n\n## 依赖\n\n* [Jsonify](https://github.com/Meniny/Jsonify)\n\n## 安装\n\n#### CocoaPods\n\n```ruby\npod 'Fire'\n```\n\n## 贡献\n\n欢迎任何人提交代码和问题。\n\n## 协议\n\nFire 是一个开源软体，遵循 `MIT` 协议。\n\n## 使用\n\n要使用 Fire 发送请求，你只需要三个步骤。\n\n首先，构建一个 Fire 实例:\n\n```swift\nlet f = Fire.build(HTTPMethod: .GET, url: \"https://yourdomain.com/get?l=zh\")\n```\n\n然后，进行一些配置:\n\n```swift\nf.setParams([\"key\": \"value\"])\nf.setFiles([file])\nf.setHTTPHeaders([\"Accept\": \"application/json\"])\nf.setBasicAuth(\"user\", password: \"pwd!@#\")\nf.setHTTPBody(raw: Data)\nlet certData = NSData(contentsOfFile: NSBundle.mainBundle().pathForResource(\"FireDemo\", ofType: \"cer\")!)!\nf.setSSLPinning(localCertData: certData) {\n    print(\"Warning: Under Man-in-the-middle attack!!\")\n}\nf.onError({ (resp, error) -\u003e Void in\n    print(\"Error: Network offline!\")\n})\n```\n\n最后，发起请求:\n\n```swift\nf.fire { (json, resp) -\u003e Void in\n    print(json[\"arg\"][\"key\"].stringValue)\n}\n\n// or\n\nf.fireForJSON { (json, resp) -\u003e Void in\n    print(json[\"arg\"][\"key\"].stringValue)\n}\n\n// or\n\nf.fireForString { (str, resp) -\u003e Void in\n    print(str)\n}\n\n// or\n\nf.fireForData { (data, resp) -\u003e Void in\n    print(\"Success\")\n}\n```\n\n如果你需要取消请求:\n\n```swift\n// cancel:\nf.onCancel {\n  print(\"Canceled\")\n}\nf.cancel()\n// or:\nf.cancel {\n   print(\"Canceled\")\n}\n```\n\n如果你想发送同步请求, 请使用 `Fire.Dispatch`:\n\n```swift\nlet f = Fire.build(HTTPMethod: .GET, url: api.stringValue, timeout: timeout, dispatch: .synchronously)\n```\n\n`Fire.API`:\n\n```swift\nopen class func FireAPI1() {\n    Fire.API.baseURL = FireDemo.BASEURL\n    let api = Fire.API(appending: \"get.php\", HTTPMethod: .GET, successCode: .success)\n    Fire.request(api: api, params: [:], timeout: 0, callback: { (json, resp) in\n        if let status = resp?.statusCode {\n            if status == api.successCode.rawValue {\n                // ...\n            }\n        }\n    }) { (error) in\n        print(error.localizedDescription)\n    }\n}\n\nopen class func FireAPI2() {\n    Fire.API.baseURL = FireDemo.BASEURL\n    let api = Fire.API(appending: \"get.php\", HTTPMethod: .GET, successCode: .success)\n    api.requestJSON(params: [\"user\": \"Elias\"], callback: { (json, resp) in\n        if let status = resp?.statusCode {\n            if status == api.successCode.rawValue {\n                // ...\n            }\n        }\n    }) { (error) in\n        print(error.localizedDescription)\n    }\n}\n\nopen class func FireAPI3() {\n    Fire.API.baseURL = FireDemo.BASEURL\n    let api = Fire.API(appending: \"get.php\", HTTPMethod: .GET, headers: [\"Content-Type\": \"text/json\"], successCode: .success)\n    api.requestJSON(params: [\"userid\": \"1232\"], headers: [\"Device\": \"iOS\"], timeout: 60, dispatch: .asynchronously, callback: { (json, resp) in\n        if let status = resp?.statusCode {\n            if status == api.successCode.rawValue {\n                // ...\n            }\n        }\n    }) { (error) in\n        print(error.localizedDescription)\n    }\n}\n```\n\n# ⽇本語\n\n## Fire とは何か？\n\n`Fire` とは Swift で作られる iOS/macOS/watchOS/tvOSiプラットホーム HTTP/HTTPS の軽量なデータのインタネットフレームワーク(Internet-Framework)、[Python-Requests:HTTP for Humans](http://docs.python-requests.org/en/master/) に深い影響を与えられた。\n\n人を理解やすくなるために、作られました。たまたまにプログラムを実行できる。\n\n## フィーチャー(Features)\n\n- [x] 連鎖されるリクエストとレスポンス のメソッド\n- [x] Upload file/data 可能\n- [x] HTTP Basic 認証をサポートしている\n- [x] SSL Pinning をサポートしている\n- [x] 全局と局部的なテスト可能\n- [x] 同期通信/非同期通信\n- [x] タイムアウト\n- [x] URLCachePolicy\n- [x] form (`x-www-form-encoded`)/JSON HTTP 制式をサポートしている\n\n## 開発環境/動作環境\n\n* iOS 8.0 以上\n* macOS 10.10 以上\n* watchOS 2.0 以上\n* tvOS 9.0 以上\n* Xcode 8 / Swift 3 以上\n\n## インストール\n\n#### CocoaPods\n\n`CocoaPods` でライブラリをインストールします。\n\nPodfile:\n\n```ruby\npod 'Fire'\n```\n\nプロジェクトのディレクトリ内で以下を実行 `pod install`\n\n## ライセンス\n\n関連するリポジトリ含め、すべてMITです。詳細は各リポジトリ内のLICENSEをご覧ください。\n\n## 貢献ガイド、サポート情報、ご留意事項\n\n`@渋谷の猫`\n\n(※準備中です)\n\n## 開発/ビルド方法/使用方法\n\n1. `Fire.build`\n\n```swift\nlet f = Fire.build(HTTPMethod: .GET, url: \"https://yourdomain.com/get?l=zh\")\n```\n\n2. `set...`/`add...`\n\n```swift\nf.setParams([\"key\": \"value\"])\nf.setFiles([file])\nf.setHTTPHeaders([\"Accept\": \"application/json\"])\nf.setBasicAuth(\"user\", password: \"pwd!@#\")\nf.setHTTPBody(raw: Data)\nlet certData = NSData(contentsOfFile: NSBundle.mainBundle().pathForResource(\"FireDemo\", ofType: \"cer\")!)!\nf.setSSLPinning(localCertData: certData) {\n    print(\"Warning: Under Man-in-the-middle attack!!\")\n}\nf.onError({ (resp, error) -\u003e Void in\n    print(\"Error: Network offline!\")\n})\n```\n\n3. `fire { (...) in }`\n\n```swift\nf.fire { (json, resp) -\u003e Void in\n    print(json[\"arg\"][\"key\"].stringValue)\n}\n\n// or\n\nf.fireForJSON { (json, resp) -\u003e Void in\n    print(json[\"arg\"][\"key\"].stringValue)\n}\n\n// or\n\nf.fireForString { (str, resp) -\u003e Void in\n    print(str)\n}\n\n// or\n\nf.fireForData { (data, resp) -\u003e Void in\n    print(\"Success\")\n}\n```\n\n```swift\n// cancel:\nf.onCancel {\n  print(\"Canceled\")\n}\nf.cancel()\n// or:\nf.cancel {\n   print(\"Canceled\")\n}\n```\n\n`Fire.Dispatch`:\n\n```swift\nlet f = Fire.build(HTTPMethod: .GET, url: api.stringValue, timeout: timeout, dispatch: .synchronously)\n```\n\n`Fire.API`:\n\n```swift\nopen class func FireAPI1() {\n    Fire.API.baseURL = FireDemo.BASEURL\n    let api = Fire.API(appending: \"get.php\", HTTPMethod: .GET, successCode: .success)\n    Fire.request(api: api, params: [:], timeout: 0, callback: { (json, resp) in\n        if let status = resp?.statusCode {\n            if status == api.successCode.rawValue {\n                // ...\n            }\n        }\n    }) { (error) in\n        print(error.localizedDescription)\n    }\n}\n\nopen class func FireAPI2() {\n    Fire.API.baseURL = FireDemo.BASEURL\n    let api = Fire.API(appending: \"get.php\", HTTPMethod: .GET, successCode: .success)\n    api.requestJSON(params: [\"user\": \"Elias\"], callback: { (json, resp) in\n        if let status = resp?.statusCode {\n            if status == api.successCode.rawValue {\n                // ...\n            }\n        }\n    }) { (error) in\n        print(error.localizedDescription)\n    }\n}\n\nopen class func FireAPI3() {\n    Fire.API.baseURL = FireDemo.BASEURL\n    let api = Fire.API(appending: \"get.php\", HTTPMethod: .GET, headers: [\"Content-Type\": \"text/json\"], successCode: .success)\n    api.requestJSON(params: [\"userid\": \"1232\"], headers: [\"Device\": \"iOS\"], timeout: 60, dispatch: .asynchronously, callback: { (json, resp) in\n        if let status = resp?.statusCode {\n            if status == api.successCode.rawValue {\n                // ...\n            }\n        }\n    }) { (error) in\n        print(error.localizedDescription)\n    }\n}\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmeniny%2Ffire","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmeniny%2Ffire","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmeniny%2Ffire/lists"}