将条形码字符串发送到Swift中的API端点



我对编程很陌生,我已经学习swift5几个月了。我正在尝试制作一个扫描1D或2D条形码的应用程序,获取字符串并将其发送到API端点,该端点将向我返回一些信息,例如产品编号和批号。

对于条形码部分,我使用了GitHub的一个非常好的软件,名为BarcodeScanner。它运行时没有任何问题,我可以从它读取的条形码中获取字符串。

一旦我有了字符串,我就可以将其发送到API端点,但随后它就被卡住了。

如果我在操场上运行相同的代码,它会毫无问题地工作,它会发出请求,我可以从服务器上看到JSON中的答案。如果我在iPhone上运行代码,它就会被卡住。当然,我不能在操场上使用扫描部分,我用它来测试网络部分和与API的通信。

这是我的Networking.swift文件,它有一些用于调试的print((:

import Foundation
import UIKit
protocol NetworkManagerDelegate: class {
func didUpdatePharmo(pharmo: PharmoModel)
func didUpdateBarcode(barcode: BarcodeModel)
}
public struct NetworkManager {

var delegate: NetworkManagerDelegate?

let pharmoURL = "https://someurl.com/api"

let pharmoEndpoint = "https://someendpoint.com/api"


func fetchData(productNumber: String) {
let urlString = "(pharmoURL)&number=(productNumber)"
performRequestProductInfo(urlString: urlString)
print(urlString)
}

func fetchEndpoint(dataMatrix: String) {
let urlString = "(pharmoEndpoint)&datamatrix=(dataMatrix)"
performRequestEndpoint(urlString: urlString)
print(urlString)   
}

func performRequestEndpoint(urlString: String) {
if let url = URL(string: urlString) {

let session = URLSession(configuration: .default)

var request = URLRequest(url: url)

request.httpMethod = "GET"

let task = session.dataTask(with: request) { (data, response, error) in
if error != nil {
print(error!)
return
}
if let response = response as? HTTPURLResponse {
print("EndPoint HTTP Status code: (response.statusCode)")

}

if let safeData = data {
if let barcode = self.parseJSONEndpoint(endPointData: safeData) {
self.delegate?.didUpdateBarcode(barcode: barcode)
}
}
}
task.resume()
}
}

func parseJSONEndpoint(endPointData: Data) -> BarcodeModel? {
let decoder = JSONDecoder()
do {
let decodedData = try decoder.decode(BarcodeData.self, from: endPointData)
let productNumber = decodedData.product_number
let batchNumber = decodedData.batchnumber

let barcode = BarcodeModel(productNumber: productNumber, batchNumber: batchNumber)



print(batchNumber)

return barcode
} catch {
print(error)
return nil
}
}

func performRequestProductInfo(urlString: String) {
if let url = URL(string: urlString) {

let session = URLSession(configuration: .default)

var request = URLRequest(url: url)

request.httpMethod = "GET"

let task = session.dataTask(with: request) { (data, response, error) in
if error != nil {
print(error!)
return
}
if let response = response as? HTTPURLResponse {
print("ProductInfo HTTP Status code: (response.statusCode)")

}

if let safeData = data {
if let pharmo = self.parseJSONProductInfo(pharmoData: safeData) {
self.delegate?.didUpdatePharmo(pharmo: pharmo)

}
}
}
task.resume()
}
}

func parseJSONProductInfo(pharmoData: Data) -> PharmoModel? {
let decoder = JSONDecoder()
do {
let decodedData = try decoder.decode(PharmoData.self, from: pharmoData)
let id = decodedData.id
let number = decodedData.number
let name = decodedData.name
let atcCode = decodedData.atc_code
let imagePath = decodedData.image_path
let displayImage = decodedData.display_image
let storageGroupId = decodedData.storage_group_id
let animalGroupId = decodedData.animal_group_id
let udlevbest = decodedData.udlevbest
let packageSizeText = decodedData.package_size_text
let packageSizeNum = decodedData.package_size_num
let unitCode = decodedData.unit_code
let strengthText = decodedData.strength_text
let prodPrice = decodedData.prod_price
let aupPrice = decodedData.aup_price
let aupInstPrice = decodedData.aup_inst_price
let animalGroups = decodedData.animal_groups
let udleveringsbestemmelse = decodedData.udleveringsbestemmelse
let animalGroup = decodedData.animal_group
let storageGroup = decodedData.storage_group
let species = decodedData.species
let indications = decodedData.indications
let substances = decodedData.substances
let manufacturer = decodedData.manufacturer


let pharmo = PharmoModel(id: id, number: number, name: name, atc_code: atcCode, image_path: imagePath, display_image: displayImage, storage_group_id: storageGroupId, animal_group_id: animalGroupId, udlevbest: udlevbest, package_size_text: packageSizeText, package_size_num: packageSizeNum, unit_code: unitCode, strength_text: strengthText, prod_price: prodPrice, aup_price: aupPrice, aup_inst_price: aupInstPrice, animal_groups: animalGroups, udleveringsbestemmelse: udleveringsbestemmelse, animal_group: animalGroup, storage_group: storageGroup, species: species, indications: indications, substances: substances, manufacturer: manufacturer)

print(name)

return pharmo

} catch {
print(error)
return nil
}
}
}

在运行条形码扫描仪的ViewController.swift中,我调用函数fetchEndpoint(dataMatrix:String(

extension ViewController: BarcodeScannerCodeDelegate {
func scanner(_ controller: BarcodeScannerViewController, didCaptureCode code: String, type: String) {
print("Barcode Data: (code)")
print("Symbology Type: (type)")

DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) {
networkManager.fetchEndpoint(dataMatrix: code)
}
}
}

从控制台输出中,我可以看到ViewController.swift:中的2条print((语句

print("Barcode Data: (code)")
print("Symbology Type: (type)")

我还可以从Networking.swift:中看到这个print((语句

print(urlString)

但之后什么也没发生。同样,如果我在操场上运行相同的代码,效果会很好。我还使用Postman发出了请求,这样我就可以看到JSON文件并确保urlstring正常工作。

有人知道我做错了什么吗?

我找到了这个问题。从扫描仪中读取的字符串包含非ASCII字符。

在任何时候,XCode都会说任何关于非ASCII字符的话,我必须将字符串复制到操场上,然后我收到了这个错误:

Unprintable ASCII character found in source file

我把这个字符串复制到一个终端外壳中,我能够看到这个字符。

datamatrix=^]01036611030467831722113010RXT0711GC

我将尝试使用URLComponentspercent encoding

相关内容

  • 没有找到相关文章

最新更新