编辑代码

{
    "refresh token":"25.b55fe1d287227ca97aab219bb249b8ab.315360000.1798
284651.282335-8574074",
    "expires_in": 2592000,
    "scope": "public wise adapt",
    "session key": "9mzdDZXu3dENdFZQurfg0Vz8slgSgvvOAUebNFzyzcpQ5EnbxbF+
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.baidubce.com/rest/2.0/image-classify/v1/car"
# 二进制方式打开图片文件
f= open('[本地文件]','rb')
img = mbase64.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-urlencoded'}
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/item/8E58B88838E588A8A08E88BF8AAChiron/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.com"
    "Friends": ["Zhang San","Li Si"]
}

{
"TeamName":"ioS-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":"lightintensity 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":80},
    "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={ users:[] }
    // Create 1000 users
    for (var i = 0; i < 1000; i++) {
       data.users.push({ 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(x=>Rand dom.image('200x100', Random.color(), Random.word(2,6)));
    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
    }

import UIKit
import Foundation

//url为MOCKMOCK服务器的网址
if let url= URL(string:"http://localhost:3004/news"){
    URLSession.shared.dataTask(with: url)(data, 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)
            }
        }
    }
    .result()
    }

func sessionGetData((){
        //创建URL对象
        let urlstring="http://www.tuling123.com/" 
        let urlmURL(stringurlString)
        //创建请求对象
        let request= URRequest(url:url!)

        let sessionmURLSession.shared
        let dataTask= session.dataTask(with: request,
                completionHandler:{(data, response, error) -> Void in
                    if error != nill
                        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= URLRequest(url:url!)
    
    let session = URLSession.shared
    //下载任务
    let downloadTask = session.downloadTask(with: request,completionHandler: {
(location:URL?,response:URLResponse?,error:Error?)
    -> Void in
    //输出下载文件原来的存放目录
    print("location:\(String(describing: location))")
    //location位置转换
    let locationPath = location?.path
    //获取当前时间
    let now= NSDate()
    //当前时间的时间戳
    let timeInterval:TimeInterval= nowtimeIntervalSince1970 
    let timeStamp=String(timeInterval)
    //拷贝到用户目录
    let documents:Str ing = NSHomeDirectory() + "/Documents/\(timeStamp).png"
    //创建文件管理器
    let fileManager= FileManager.default 
    try! fileManager. noveItem(atPath: locationPath!, toPath:documents)
    print("new locat ion:\(documents)")
})
    //使用 resume方法启动任务
    downloadTask.resume()
    }

<?php
/** php 接收流文件
* @param String$file 接收后保存的文件名
* @return boolean
*/
function receivestreamFile($receiveFile){
    $streamData = isset($GLOBALS['HTTP RAW POST DATA'])? $GLOBALS['HTTP_RAW_POST DATA'] :'';

    if(empty($streamData)){
    $streamData= file get contents('php://input'); 
    }

    if($streamData!=''){
        $ret = file put contents($receiveFile, $streamData, true);
        }else{
        $ret= falsei
        }
return $ret;
}
//定义服务器存储路径和文件名
$receiveFile = $ SERVER["DOC UMENT ROOT"]."/uploadFiles/swift.png"; echo $receivefile;
$ret= receiveStreamFile($rec eiveFile)i
echo json_encode(array('succe ss'=>(bool)$ret));
?>

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

let uploadTask= session.uploadTask(with: request as URLRequest, from:
imgData){
(data:Data?,response:URLResponse?,error:Error?) -> Void in
//上传完毕后
if error != nil{
print(error!)}else{
let str = Stringdata: data!, encoding: String.Encoding.utf8) 
print("上传完毕:\(String(describing:str))")
}
}

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

import UIkit
import Foundation

let API Key="EIpAlhdD7i5152EsiNqpUoF_"
let Secret Key="p8E2Wg4agjDOxABmKvBYSNyZ1YzGFqb_"
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 = json["expires in"] as! Int32 
print("--------access token------") 
print(access token)
print("--------expires_time------") 
print(expires in)
}
}
}
.resume()
else {
print ("url error")
}

//以文本或者二进制方式读入源程序文件的 Loader 
public struct Loader {
    static func readTxt(file url:URL) -> String? {
        do {
            let source = try String(contentsOf: url) 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:"qrcar.jpg",ofType: nil) leturl=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="242ec96a68f74a8429b0f07869929413ae25920001598921312282335 -21737249"
let carType host="https://aipbaidubce.com/rest/2.0/image-classify/v1/ car" + "?access token=" + "\(access token)"

if let url = URL(string: carType_host) {
    var request= URLRequest(url:url)
request.setValue("application/x-www-form-urlencoded",forHTTPHeaderField:"Content-Type")
request.httpMethod="POST"
let cs= NSCharacterSet(charactersIn:"/=+8").inverted
let image_urlEncode- data base64str!.addingPercentEncoding(withAllowedCharacters:cs)
let poststring="image=\(image_urlEncode!)&topnum=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": 
{
"baike_url":"/item/8E58A58878E789189EE5/475143"
"image_url":
"/pic/5882b2b7d0a20cf47a91d7777c094b36acaf9910","description":
"2014款奇瑞E5是国内科技家轿的引领者,带领消费者悦享领先科技。"
},
"name":"奇瑞E5"
},
"score":0.007103727199137211,
"name":"奇瑞旗云",
"year":"2010-2013"
},
{
"score":0.003686367534101009,
"name":"奇瑞艾瑞泽7",
"year":"2016-2017"
},
{
"score": 0.001757977530360222,
"name":"奇瑞 E3",
"year":"2015-2017"
},
{
"score":0.001047104829922318,
"name":"奇瑞 A5",
"year":"2015"
}
],
"color result":"黑色"
}

//
//  viewcontroller.swift
//  camerausage
//
// Created by Zhifeng Chen on 2020/8/2. 
//Copyright  2020 Zhifeng Chen. All rights reserved.
//

import uIkit

class ViewController:UIViewControllerUINavigationControllerDelegate,UIImagePickerControllerDelegate{
//设置图像显示用的Outlet,就是变量carImageView
@IBOutlet weak var carImageView: UIImageView!
//设置Action,由相册按钮事件触发
@IBAction func onLibrary(_ sender: UIButton){
//设置相册拍照的控制器
let vc = UIImagePickerController()
//设置为相册
vc.sourceType=.photoLibrary 
vc.allowsEditingmtrue 
vc.delegate= self
present(vc, animated: true)
//设置Action,由拍照按钮事件触发
@IBAction func onCamera(_sender: UIButton){
letvc= UIImagePickerController()
//设置为摄像头
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}
}

//
// ViewController.swift 
// CameraUsage 
//
// Created by Zhifeng Chen on 2020/8/2. 
// Copyright  2020 Zhifeng Chen. All rights reserved.
//
import uikit
class ViewController:UIViewControllerUINavigationControllerDelegate.UIImagePickerControllerDelegate{
//设置图像显示用的 Outlet,就是变量carImageview
@IBOutlet weak var carImageView:UIImageView!
//显示识别出来的车辆名称型号
@IBOutlet weak var carName: UILabel!
//显示该车辆百度百科里面的简介
@IBOutlet weak var carDetails: UILabel!
//设置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= UIImagePickerController()
//设置为摄像头
vc.sourceType=.camera 
vc.allowsEditing = true 
vc.delegate = self
present(vc, animated: true)
)
//相册获取图片需要调用的 Delegate
func imagePickerController(_ picker: UIImagePickerControllerrdidFinishPickingMediaWithInfo 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 {
//从百度AI获得车型信息
get_car_type(access token: access token)
}
//传入有效的access token,上传图片,获得车型信息 
func get car type(access token: String){
//获取显示的图片,并保存为jpg格式 
let imagemcarImageView.image
//let data=UIImagePNGRepresentation(image)
guard let data = image! ipegData(compressionQuality:0.5) else {
return}
//将图片进行base64编码
let data base64_str= data.base64Encodedstring()
//准备好获取车型的API的URL的字符串
let carType host m"https://aip.baidubce.com/rest/2.0/image
classify/v1/car" + "?access token=" + "\(access token)"
//从字符串转换为 URL
if let url= URL(string: carType host){
//从URL生成URLRequest
var request= URLRequest(url:url)
//设置HTTP HEADER中的Content-Type为application/x-www-formurlencoded
request.setValue("application/x-www-form-urlencoded",forHTTPHeaderField:"Content-Type")
//设置为 POST 方法
request.httpMethod = "POST"
//将图片文件进行urlencode转码
let cs = NSCharacterSet(charactersIn:"/=+8").inverted
let image urlEncode = data_base64_str.addingPercentEncodin
g(withAllowedCharacters: cs)
//合并三个参数为一个字符串
let postString ="image-\(image urlEncode!) &top_num-5&baike num-1"
//将字符串转为 UTF8 类型的数据
request.httpBody= poststring.data(using:utf8)
//URLSession 调用
URLSession.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 = json["result"] as! Array<Dictionary<
String,Any>>
let name = result[0]["name"] as! string var description="非车类" if name!="非车类"{
let baike info = result[0]["baike_info"] as!
Dictionary<String,String>
if let details = baike info["description"]{
description = details
else {
description="百度百科无此车资料"}
//转入主线程
DispatchQueue.main.async {
self.carDetails.text=description self.carName.text=name
}
}
.resume()
/
}
//以信号量方式等待网络结果返回 access_token,如果没有成功,则返回"" func get baidu token()->String{
let API Key="EIpAlhdD7i5152EsiNgpUF1"
let Secret Key="p8EZWg4agjDOxABmKvBYSNyZ1YzGFqbm"
let token host="https://aipbaidubce.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,responseerror)in
if error != nil {
    print("network error")
else {
if let jsonm try? JSONSerializationjsonObject(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
}
}