Home > database >  Importing JSON from URL within a view
Importing JSON from URL within a view

Time:01-01

So, new to swift and was able to peice this together by reading and watching videos however i reached a point after countless hours searching for a solution..

Basically what the app does is scan's a qr code, parses the url it reads from the qr code to get a key, then I am appending that key to the api url, and i want to output the results from the api to the screen. however I am receiving an error Type '()' cannot conform to 'View' in xcode

Here is sample json data

[
{
"id": "160468",
"sport": "BASKETBALL",
"year": "2020",
"brand": "PANINI PRIZM",
"cardNumber": "278",
"playerName": "LaMELO BALL",
"extra": "",
"gradeName": "MINT",
"grade": "9",
"serial": "63585906",
"authDate": "1656406800",
"link": "https://www.example.com/certificate-verification?certificateNumber=63585906"
}
]

here is my contentview

import SwiftUI
import CodeScanner

extension URL {
    var components: URLComponents? {
        return URLComponents(url: self, resolvingAgainstBaseURL: false)
    }
}

extension Array where Iterator.Element == URLQueryItem {
    subscript(_ key: String) -> String? {
        return first(where: { $0.name == key })?.value
    }
}

struct Card: Decodable {
    let sport: String
    let year: String
    let brand: String
    let cardNumber: String
    let playerName: String
    let extra: String
    let gradeName: String
    let grade: String
    let serial: String
}

struct ContentView: View {
    @State var isPresentingScanner = false
    @State var scannedCode: String = ""
    
    var scannerSheet : some View {
        CodeScannerView(
            codeTypes: [.qr],
            completion: { result in
                if case let .success(code) = result {
                    self.scannedCode = code.string
                    self.isPresentingScanner = false
                }
            }
        )
    }
    
    func getQueryStringParameter(url: String, param: String) -> String? {
      guard let url = URLComponents(string: url) else { return nil }
      return url.queryItems?.first(where: { $0.name == param })?.value
    }
    

    
    var body: some View {
        
        VStack(spacing: 10) {
            
            Image("logo-white")
                .offset(y: -200)

            if let urlComponents = URL(string: scannedCode)?.components,
                let cert = urlComponents.queryItems?["certificateNumber"] {
                //Text(cert)

                let apihit = URL(string: "https://app.example.com/api.php?apikey=xxx&cert=\(cert)")!
               
                //Text(apihit.absoluteString)
                
                var request = URLRequest(url: apihit)

                request.setValue("application/json", forHTTPHeaderField: "Content-Type")
                
                let task = URLSession.shared.dataTask(with: apihit) { data, response, error in
                    if let data = data {
                        if let cards = try? JSONDecoder().decode([Card].self, from: data) {
                            print(cards)
                        } else {
                            print("Invalid Response")
                        }
                    } else if let error = error {
                        print("HTTP Request Failed \(error)")
                    }
                }
                
            }
            
            
            Button("Scan QR Code") {
                self.isPresentingScanner = true
            }
            
            .padding()
            .background(Color(red: 0, green: 0, blue: 0.5))
            .foregroundColor(.white)
            .clipShape(Rectangle())
            .cornerRadius(20)
            
            .sheet(isPresented: $isPresentingScanner) {
                self.scannerSheet
            }
        }
        .frame(maxWidth: .infinity, maxHeight: .infinity)
        .background(.gray)
        
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

I have tried countless tutorials online, however none of them show how to do it within the view, which I believe is where it belongs because I don't get the actual json url until after I read the qr code..

CodePudding user response:

I figured this out by creating a class that calls the api, with the url sent by the function call.

CodePudding user response:

To populate a link within a view, use Webkit.

First you need to import Webkit. Then, create a WebView which conforms to the UIViewRepresentable protocol.

Here is the Apple documentation. This is the easiest way to integrate web content into your app.

I hope this helps!

  • Related