编辑代码

{
    "refresh_token": "25.b55fe1d287227ca97aab219bb24908ab.315360000.1798284651.282335-8574074",
    "expires_in": 2592000,
    "scope": "public wise_adapt",
    "session_key": "9mzdDZXu3dENdEZQurfgOVz8s1gSgvvOAUebNFzyzcp05EnbxbF+hfG9DQkpUVQdh4p6HbQcAiz5RmuBAjalJJGgIdJI",
    "access_ token": "24.6c5e1ff107f0e8bcef8c46d3424a0e78.2592000.1485516651.282335-8574074",
    "session_secret": "dfac94a3489fe9fca7c3221cbf7525ff"
}

{
    "error": "invalid_client",
    "error_description": "unknown client id"
}
在获得access_token 后,可以调用相关功能的API来完成该功能,如车型识别能力。
# encoding:utf-8
import requests

# client_id 为官网获取的AK, client_secret 为官网获取的 SK
host='https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id= 【官网获取的AK】 
&client_secret= 【官网获取的 SK】'
response = requests.get(host) 
if response:
print(response.json())


# encoding:utf-8
import requests 
import base64
'''
车型识别
'''
request_url = "https://aip.baidubee.com/rest/2.0/image-classiEy/v1/car"
#二进制方式打开图片文件
f = open('[本地文件]', 'rb')
img = base64.b64encode (f.read ())

params = {"image":img,"top_num":5}
access_token= '[调用鉴权接口获取的 token]'
request_url = request_url + "?access_token=" + access_token
headers = {'content-type': 'application/x-www-form-ur1encoded'}
response = requests.post(request_url, data=params, headers=headers)
if response:
print (response.json ())
返回的 JSON 数据:
{
    "log_id”: 4086212218842203806,
    "location_result": {
        "width": 447,
        "top": 226,
        "height": 209,
        "left": 188
},
"result":[{
    "baike_info": {
        "baike_url: "http://baike.baidu.com/iten/E5%B8%83%5%82%A08E8BFAAchiron/20419512",
    "description""布加迪 Chiron 是法国跑车品牌布加迪出品的豪华超跑车。配置四涡轮增压发动机,420 公里每小时,有23种颜色的选择。售价高达 260万美元。"
},
 "score": 0.98793351650238,
"name”:" 布加迪 Chiron",
"year":"无年份信息"
},
{
"score": 0.0021970034576952,
"name":"奥迫RS5",
"year": "2011-2017"
},
{
"score": 0.0021096928976476,
"name": "奥迪RS4",
"year": "无年份信息"
},
{
    "score": 0.0015581247862428,
    "name": "奥迪RS7",
    "year": "2014-2016"
},
{
    "score": 0.00082337751518935,
    "name": "布加迪威航",
    "year": "2004-2015"
}],
"color_result": "颜色无法识别"
}


{
    "Name": "Chen Zhifeng",
    "Profession": "Teacher",
    "Age": 46,
    "Email": "13402506301@163.con",
    "Eriends" : InZhang San", "Li si"]

}


{
    "TeamName":"i0S-Orange-Team",
     "Teacher": "Chen Zhifeng",
    "Students": [
        { "Name": "Zhang Bo","Hometown": "Xuzhou"'},
        {"Name": " Chang Wenxiang ", "Hometown": "Yancheng"),
        {"Name" :" Hu Yinting". "Hometown": "Suzhou"}
    ]
}
{
    "coord": ("lon": -0.13, "lat": 51.51},
    "weather": ("id": 300, "main": "Drizzle", "description": "light intensity drizzle", "icon": "09d"} ],
    "base":"stations"
    "main": {
        "temp": 280.32,
        "pressure": 1012,
        "humidity": 81,
        "temp min":279.15,
        "temp_max":281.15
    }, 
    "visibility": 10000,
    "wind": ("speed": 4.1, "deg": 801},
    "clouds": ("all": 90},
    "dt": 1485789600,
    "sys": {
        "type": 1,
        "id": 5091,
        "message": 0.0103,
        "country": "GB",
        "sunrise" :1485762037
        "sunset": 1485794875
    }, 
    "id": 2643743,
    "name": "London",
    "cod":200

}

# myjson. js

module.exports = function () {
    var data = f users: [] }
    // Create 1000 users
    for (var i = 0; i < 1000; i++) {
        data .users .push (f id: i, name: 'user' +i })
        }
return data
}


# news .Js
let Mock = require ('mockjs');
let Random = Mock. Random;
module.exports = function () {
    var data = {
        news:  []
    };
    var images = [1,2,3] .map (×=>Random. image ('200×100', Random. color (), Random. word (2, 5)));
    for (var i = 0; i < 100; i++) {
        var content - Random. cparagraph (0,10) ;
        data.news.push ( {
            id: i,
            title: Random.cword (8,20),
            desc: content.substr (0,40) ,
            tag: Random.cword (2,6) ,
            views: Random.integer (100,5000),
            images: images.slice (0, Random. integer (1,3) )
        })
    }
    return data
}


imoort UIKit
import Foundation

//uri 为 MOCKMOCK 服务器的网址
if let url = URL (string: "http: / /1ocalhost:3004/news") {
    JRISession. shared. dataTask (with: url) t(datar response, error) in
    if error != nil {
        print ("Network errors")
    }
    else {
        let rs = String (data: data!, encoding: String. Encoding.utf8) !
        print (rs)
        if let json = try? JSONSerialization. jsonObject (with: data!, options: .allowFragments)   {
            print(json)
            }
        }
    }
    .resume()
}


func sessionGetData () {
    //创建 URI 对象
    let urlstring = "http: //www.tuling123.com/"
    let url = uRL (string: urlstring)
    //创建请求对象
    let request = URLRequest (url: url!)

    let session = URLSession . shared
    let dataTask = session.dataTask (with: request,
        completionHandler: ( (data, response, error) -> Void in
            if error != nilf{
                print (error.debugDescription)
        }else{
            let str = String (data: data!, encoding: String. Encoding.utf8)
            print (str!) 
            }
        }) as URLSessionTask
        //使用 resume 方法启动任务
        dataTask. resume ( )
    } 
func sessionDownloadImage () {
    //下载地址
    let url = URL (string: "http: / /hangge.com/blog/ images/logo.png")
    //请求
    let request = ULRequest (url: url!)

    let session = URLSession.shared
    //下载任务
    let downloadTask = session. downloadTask (with: request,
                                              completionHandler: {
(location : URL?, response : URLResponse?, error:ErrOr?)
                                                                -> Void in
        //输出下载文件原来的存放目录
        print ("location : 1 (string (describing : 1ocation))")
        //1ocation 位置转换
        let locationPath = location?.path

        //获取当前时间
        let now = NsDate ()
        //当前时间的时问戳
        let timeInterval: TimeInterval = now. timeIntervalSince1970
        let timestamp = String (timeInterval)
        //拷贝到用户目录
        let documents: String = NSHomeDirectory () + "/Documents/\(timeStamp).png"
        //创建文件管理器
        let fileManager = FileManager. default
        try! fileManager moveItem (atPath: locationPath!, toPath: documents)
        print ("new location: 1 (documents)")

    } )
    //使用resume 方法启动任务
    downloadTask.resume ()
}


<?php
/** php 接收流文件
* @paramStringsfile 接收后保存的文件名
* @return boolean
* /
function receiveStreamFile ($receiveFile) {
$streampata = isset ($GLOBALS['HTTP_RAW_POST_ DATA'])? $GLOBATS ['HTTP_RAW_POST_DATA'] : '';

if (empty ($streamData)) {
    $streamData = file_get_contents ('php://input");
    }

    if ($streamData!='') {
        $ret = file _put_contents ($receiveFile, $streamData, true);
    }else {
        $ret = false;
    }

    rqeeturn $ret;
}
// 定义服务器存储路径和文件名
$receiveFile = $_SERVER[" DOCUMENI_ROOT"]."/ uploadFiles / swift . png";
echo $receiveFile;
$ret = receiveStreamFile ($receiveFile) ;
echo json_ encode (array ('success ' => (bool) sret));

?>


func sessionUploadPhp () {
    //上传地址
    let uri = URL(string: "http://localhost/uploadSwift.php")
    //1.创建会话对象
    let session = URLSession.shared
    //请求
    var request - URLecuest (url: uri!, cachePolicy: •reloadIgnoringCacheData)
    request.httpMethod = "POST"
    //上传数据流
    let tileImage = Bundle. main.path (forResource : "beel ", ofType: "png")
    let ingData = try! Data (contentsOf: URL (fileURIWi thPath: fileImage !))

    let uploadIask = session.uploadTask (with: request as URLRequest, from:imaData) {
        (data: Data?, response: URLResponse?, error:Error?) -> Void in
        //上传完毕后
        if error != nill {
            print (error!)
        }else {
            let str = string (data: data!, encoding: string .Encoding .utf8)
            print"上传完毕:\(String (describing:stz))")
        }
    }
    //使用resume 方法启动任务
    uploadTask.resume ()
}


import UIKit 
import Foundation

let API_Key = "EIpAlhdD715152EsiNqpUOF_"
let Secret Key = "P8EZWg4agjDOxABmKvBYSNyZ1YzGFqb_"

let token_ host = "https: //aip.baidubce.com/oauth/2.0/token?grant_type=client_ credentials&client_id=\(API Key) &client_secret =\(Secret_Key)"

var access_token = ""
var expires_in: Int32 = 0

if let url = URL (string: token_host) {
    URLSession. shared. dataTask (with: url) { (data, response, error) in
        if error != nil {
            print ("network error")
        }
        else {
            if let json = try? JSONSerialization.jsonObject (with: data!,options: allowFragments) as?[String:Any] {
            access_token = json ["access_token"] as! String
            expires_in = ison["expires_in"] as! Int32
            print ("--------access_token------")
            print (access_token)
            print ("--------expires_time------")
            print (expires_in)
            }
        }
    }
    .resume()
}
else {
    print("url error")
}


//以文本或者二进制方式读入源程序文件的 Ioader
public struct Loader {
    static func readTxt (file url:URI) ->String? {
        do {
            let source = try String (contentsOf: ur1)
            return source
        }
        catch {
            return nil
        }
    }
    static func readBin (file url:URL) 一> Data? {
        do {
            let data = try Data (contentsOf: url)
            return data
        }
        catch {
            return nil
        }
    }
}


//Resources 中的文件,并把路径转化为 URL
let path = Bundle. main.path (forResource: "grcar. jpg", ofType: nil)
let url = URL (fileURLWithPath: path!)

let data = Loader.readBin (file: url)

if(data == nil) {
    print ("File failed to load")
}

let data base64 str = data? .base64EncodedString()
let data base64 = data?.base64EncodedData ( )


access_token="24.2ec96a68f74a8429b0f07869929413ae.2592000.1598921312.282335-21737249"
    let carType_host ="https://aip.baidubce.com/rest/2.0/image-classify/v1/car" + "?access_token=" + "\(access_token)"

    if let url = URL(string: carType_host) {
    var request = URLRequest (url: ur1)
    request. setValue ("application/×-www-form-urlencoded", forHTTPHeaderField:"Content-Type")
    request.httpMethod = "POST"

    let cs = NSCharacterSet (charactersIn: "/=+%") .inverted
    let image_urlEncode = data_base64_str!.addingPercentEncoding (withAllowedCharacters: cs)
    let postString = "image=\(image_urlEncode!) &top_num=5&baike_num=1"

    request.httpBody = postString.data (using: .utf8)

    URLSession.shared.dataTask(with: request) { (data,response, error) in
        if error != nil {
            print ("error")
        }
    else {
        let rs = String (data: data!, encoding: String. Encoding.utf8)
        print(rs!)
        }
    }
    .resume ()
}
{
    “log_id" : 4368540366187197442,
    "location_ result:
    {
        "width":386.4585876464844,
        "top": 81.3405532836914,
        "height"183.9795532226562,
        "left": 58.03330230712891
    }, 
    "result":

    [
        {
            "score":0.9767324924468994,
            "year": "2014-2017",
            "baike_info":
        {
            "baike url": i/item/8E5gA5%87%87%91%9EE5/475143",
            "image arl":
            "/pic/5882b2b7a0a20cf47a91d7777c094b36acaf9910",
            "description":
            "2014 款奇瑞巴5 是国内科技家桥的引领者,带领消费者悦享领先科技。"
            },
        "name":"奇瑞E5"
        },
        {
            "score : 0.007103727199137211,
            "name""奇瑞旗云""year": "2010-2013"
        },
        {
            "score":0.003686367534101009,
            "name""奇瑞艾瑞泽 7""year": "2016-2017"
        },
        {
            "score": 0.001757977530360222,
            "name":“ 奇瑞53”,
            "year": "2015-2017"
        },
        {
            "score": 0.001047104829922318,
            "name ":“ 奇瑞A5",
            "year": "2015"
        }
    ],
    "color result" " 黒色"
}


//
// ViewController.swift
// CameraUsge
//
// Created by Zhifeng Chen on 2020/8/2.
// Copyright • 2020 Zhifeng Chen. All rights reserved.
//

import UIKit

class ViewController: UIViewcontroller , UINavigationControllerDelegate,UITmagePickerControllerDelegate{
    //设置因像显示用的outlet,就是变量 car ImageView
    @IBOutlet weak var carImageView: UIImageView!
    //设置 Action,由相册按钮事件触发
    @IBAction func onLibrary (_sender: UIButton) {
        //设置相册拍照的控制器
        let vc = UIImagePickerController ()
        //设置为相册
        vc. sourceType = .photoLibrary
        vc.allowsEditing = true
        vc.delegate = self
        present (vc, animated: true)
    } 
    //设置Action,由拍照按钮事件触发
    @IBAction func oncamera( sender: UIButton) {
        let vc = UlImagePickerController ()
        //设置为摄像头
        vc. sourceType = .camera
        vc.allowsEditing = true
        vc. delegate = self
        present (vC, animated: true)
    }
        //相價荻取圏片需要凋用的 Delegate
        func imagePickerController|_ picker: UIImagePickerController didFinishPickingMediawithInfo info: (UI ImagePickerController.InfoKey: Any))
        picker. dismiss (animated: true)
        guard let image = infol.editedImage\ as? UI Image else {
            return
        }
        // 将相册图片显示在 carImageview 中
        carImageView.image = image
    }
}

//
// ViewController.swift
// CameraUsage
// 
// Created by Zhifeng Chen on 2020/8/2.
// Copyright @  2020 Zhifeng Chen. All rights reserved.
//

import UIKit

class viewcontroller: UIViewcontroller , UINavigationcontrol1erDelegate,UIInagePickercontrollerDelegatet{
    //设置图像显示用的outlet,就是变量 car Imageview
    @ IBoutlet veak var carImageview : UIImageview!
    //显示识别出来的车辆名称型号
    @IBOutlet weak var carDetails: UILabel !
    //设置 Action,由相册按钮事件触发
    @IBAction func onlibrary (_ sender: UIButton) {
        //设置相册拍照的控制器
        let ve = UIImagePickercontroller ()
        //设置为相册
        vC.sourceType = .photoLibrary
        vc.allowsEditing = true
        vc.delegate = self
        present (vc, animated: true)
    }
    // 设置Action,由拍照按钮事件触发
    @IBAction func onCamera (_ sender: UIButton) {
        let vc = UIInagePickerController ()
        //设置为摄像头
        vc. sourceType = .camera
        vc.allowsEditing = true
        vc.delegate = self
        present (vc, animated: true)
    }
    //相册英取图片需要调用的 Delegate
    func imagePickerController (_ picker: UIImagePickerController,didFinishPickingMediaWithInfo info: (UIImagePickerController. InfoKey : Any]) {
        picker.dismiss (animated: true)
        guard let image = info [.editedImage] as? UIImage else {
            return
        }
        //将相册图片显示在 carImageview 中
        carImageView.image = image
        //获得百度AI平台access_token
        let access_token = get_baidu_ token ()
        if access_token == "" {
            return
        }
        else {
            //从百度A工 获得车型信息
            get_car_ type (access_token: access_token)
        }
    }

    //传入有效的access_ token,上传图片,荻得车型信息
    func get_car_type (access_token: String) {
        //获取显示的图片,,并保存为jpg格式
        let image = carImageView. image
        //let data = UIImagePNGRepresentation (image)
        guard let data = image!. jpegData (compressionQuality: 0.5) else {
            return
        }
        //将图片进行 base64 编码
        let data_base64_str = data.base64Encodedstring ()
        //准备好获取车型的AB工 的URI, 的字符串
        let carType_host = "https: //aip.baidubce.com/ rest /2.0/ image-classify/v1/car" + "?access_token=" + "' (access_token) "
        //从字符串转换为 URL
        if let url = URI (string: carType_host) {
            //从 URI 生成 URIRequest
            var reguest = URLReguest (url: url)
            //设置 ETP HEADER 中的 content-Type 为 application/x-www-form-urlencoded
            request. setValue ("application/x-www-form-urlencoded", fortITPHeaderField:"content-Type")
            //设置为 POSI 方法
            request.httpMethod = "POST"
            //将图片文件进行 urlencode 转码
            let cs = NSCharacterset (charactersIn: "/=+8").inverted
            let image urlEncode = data base64 str .addingPercentEncoding (withAllovedCharacters:cs)
            //合并三个参数为一个字符串
            let poststring = "image=1 (image_ ur1Encode !) atop num=5abaike num-1"
            //将字符串转为UTF8 类的数据
            request.httpBody = postString.data (using: .utf8)
            //URLSession 调用
            URISession. shared.dataTask (with: request) | (data, response,error) in
            if error != nil {
        print("error")
    }
    else {
        if let json = try? JSONSerialization. jsonObject (with:data!, options: .allowFragments) as? [String : Any] (
            let result = son ["result") as! Array<Dictionary<String, Any>>
            let name = result (0] ("name"] as! String
            var description ="非车类”
            if name != n 非车类"(
                let baike info = result (0] ("baike info"] as!Dictionary<String, String>
                if let details = baike info["description"] {
                    description = details

    }
    else {
        desoription = "百度百科无此车资料"
    }
}
    //转入主线程
    DispatchQueue.main.async {
        self .carDetails.text = description
        self.carName.text = name
        }
    }
    }
    }
    .resume ( )
    }
}

//以信号量方式等待网络结果返回access_token,如果没有成功,则返回"”
func get baidu_ token () -›String {
    let API_Key = "EIpAlhdD7i5152EsiNgpU0F1"
    let Secret_Key = "p8EZWg4agjDOxABmKvBYSNyZ1ŸzGFqbm"
    let token host = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client credentials&client id=\(API Key) §client secret=\ (Secret _Key) "

    var access token = ""
    //设置信号量
    let semaphore: DispatchSemaphore = DispatchSemaphore (value: 0)

    if let url = URL (string: token host) {
        URLSession. shared. dataTask (with: url) { (data, response, error) in if error != nil {
            print ("network error")
        }
        else {
            if let json = try? JSONSerialization. jsonObject (with:data!, options: allowFragments) as? [String : Any] {
                access_token = json ["access_token"] as! String
            }
        }
        //发出信号量
        semaphore.signal ()
    }
    .resume ()
    }
    else {
           print ("url error")
       }
        //等待信号量
        semaphore.wait ()
        return access token
   }
}