Bruno Coelho 2354d402a8
[swift6] promote to beta and improve documentation (#19856)
* [swift6] promote to beta

* [swift6] format code

* [swift] authentication docs

* [swift] update docs

* [swift] update docs

* [swift] update docs

* [swift] update docs

* [swift] update docs

* [swift] update docs

* [swift] update docs

* [swift] update docs

* [swift] update docs

* [swift] update docs
2024-10-14 12:55:25 +01:00

11 KiB

Swift6 API client for PetstoreClient

This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: " \

Overview

This API client was generated by the OpenAPI Generator project. By using the openapi-spec from a remote server, you can easily generate an API client.

  • API version: 1.0.0
  • Package version:
  • Generator version: 7.10.0-SNAPSHOT
  • Build package: org.openapitools.codegen.languages.Swift6ClientCodegen

Installation

Carthage

Run carthage update

CocoaPods

Run pod install

Documentation for API Endpoints

All URIs are relative to http://petstore.swagger.io:80/v2

Class Method HTTP request Description
AnotherFakeAPI call123testSpecialTags PATCH /another-fake/dummy To test special tags
FakeAPI fakeOuterBooleanSerialize POST /fake/outer/boolean
FakeAPI fakeOuterCompositeSerialize POST /fake/outer/composite
FakeAPI fakeOuterNumberSerialize POST /fake/outer/number
FakeAPI fakeOuterStringSerialize POST /fake/outer/string
FakeAPI testBodyWithFileSchema PUT /fake/body-with-file-schema
FakeAPI testBodyWithQueryParams PUT /fake/body-with-query-params
FakeAPI testClientModel PATCH /fake To test "client" model
FakeAPI testEndpointParameters POST /fake Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트
FakeAPI testEnumParameters GET /fake To test enum parameters
FakeAPI testGroupParameters DELETE /fake Fake endpoint to test group parameters (optional)
FakeAPI testInlineAdditionalProperties POST /fake/inline-additionalProperties test inline additionalProperties
FakeAPI testJsonFormData GET /fake/jsonFormData test json serialization of form data
FakeClassnameTags123API testClassname PATCH /fake_classname_test To test class name in snake case
PetAPI addPet POST /pet Add a new pet to the store
PetAPI deletePet DELETE /pet/{petId} Deletes a pet
PetAPI findPetsByStatus GET /pet/findByStatus Finds Pets by status
PetAPI findPetsByTags GET /pet/findByTags Finds Pets by tags
PetAPI getPetById GET /pet/{petId} Find pet by ID
PetAPI updatePet PUT /pet Update an existing pet
PetAPI updatePetWithForm POST /pet/{petId} Updates a pet in the store with form data
PetAPI uploadFile POST /pet/{petId}/uploadImage uploads an image
PetAPI uploadFileWithRequiredFile POST /fake/{petId}/uploadImageWithRequiredFile uploads an image (required)
StoreAPI deleteOrder DELETE /store/order/{order_id} Delete purchase order by ID
StoreAPI getInventory GET /store/inventory Returns pet inventories by status
StoreAPI getOrderById GET /store/order/{order_id} Find purchase order by ID
StoreAPI placeOrder POST /store/order Place an order for a pet
UserAPI createUser POST /user Create user
UserAPI createUsersWithArrayInput POST /user/createWithArray Creates list of users with given input array
UserAPI createUsersWithListInput POST /user/createWithList Creates list of users with given input array
UserAPI deleteUser DELETE /user/{username} Delete user
UserAPI getUserByName GET /user/{username} Get user by user name
UserAPI loginUser GET /user/login Logs user into the system
UserAPI logoutUser GET /user/logout Logs out current logged in user session
UserAPI updateUser PUT /user/{username} Updated user

Documentation For Models

Documentation For Authorization

Authentication schemes defined for the API:

petstore_auth

api_key

  • Type: API key
  • API key parameter name: api_key
  • Location: HTTP header

api_key_query

  • Type: API key
  • API key parameter name: api_key_query
  • Location: URL query string

http_basic_test

  • Type: HTTP basic authentication

How do I implement bearer token authentication with URLSession on the Swift 6 API client?

First you implement the OpenAPIInterceptor protocol.

public class BearerOpenAPIInterceptor: OpenAPIInterceptor {
    public init() {}
    
    public func intercept(urlRequest: URLRequest, urlSession: URLSessionProtocol, openAPIClient: OpenAPIClient, completion: @escaping (Result<URLRequest, any Error>) -> Void) {
        refreshTokenIfDoesntExist { token in
            
            // Change the current url request
            var newUrlRequest = urlRequest
            newUrlRequest.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
            
            // Change the global headers
            openAPIClient.customHeaders["Authorization"] = "Bearer \(token)"
            
            completion(.success(newUrlRequest))
        }
    }
    
    public func retry(urlRequest: URLRequest, urlSession: URLSessionProtocol, openAPIClient: OpenAPIClient, data: Data?, response: URLResponse, error: Error, completion: @escaping (OpenAPIInterceptorRetry) -> Void) {
        // We will analyse the response to see if it's a 401, and if it's a 401, we will refresh the token and retry the request
        refreshTokenIfUnauthorizedRequestResponse(
            data: data,
            response: response,
            error: error
        ) { (wasTokenRefreshed, newToken) in
            
            if wasTokenRefreshed, let newToken = newToken {
                
                // Change the global headers
                openAPIClient.customHeaders["Authorization"] = "Bearer \(newToken)"
                
                completion(.retry)
            } else {
                // If the token was not refreshed, it's because it was not a 401 error, so we send the response to the completion block
                completion(.dontRetry)
            }
        }
    }
    
    private var bearerToken: String? = nil
    
    func refreshTokenIfDoesntExist(completionHandler: @escaping (String) -> Void) {
        if let bearerToken = bearerToken {
            completionHandler(bearerToken)
        } else {
            startRefreshingToken { token in
                completionHandler(token)
            }
        }
    }
    
    func refreshTokenIfUnauthorizedRequestResponse(data: Data?, response: URLResponse, error: Error, completionHandler: @escaping (Bool, String?) -> Void) {
        if let response = response as? HTTPURLResponse, response.statusCode == 401 {
            startRefreshingToken { token in
                completionHandler(true, token)
            }
        } else {
            completionHandler(false, nil)
        }
    }
    
    private func startRefreshingToken(completionHandler: @escaping (String) -> Void) {
        // Get a bearer token
        let dummyBearerToken = "..."
        
        bearerToken = dummyBearerToken

        completionHandler(dummyBearerToken)
    }
}

Then you assign the BearerOpenAPIInterceptor to the property OpenAPIClient.shared.interceptor.

OpenAPIClient.shared.interceptor = BearerOpenAPIInterceptor()

Here is a working sample that put's together all of this. AppDelegate.swift BearerTokenHandler.swift

Author