Niklas Werner 80cf1324c5 C Generator Sample - Improvements (#558)
* Added a .gitignore to ignore the build folder

* Added a CMakeLists and a basic implementation of a double linked list

* Added the pet model

* changed the behaviour when a list gets freed - the data of each element doesn't get freed anymore

* Added the tool uncrustify in order to make code look better

* Uncrustified code

* added an implementation(constructor and deconstructor) for the category model

* Added a third party JSON library

* The pet struct now uses pointers for its members; the pet struct now has a proper constructor and a basic toJSON method

* The pet model now gets fully serialized into JSON

* Fixed the example url...

* Added third party library libcurl

* Modified category struct and added an unit test

* Added a foreach macro and added two functions

* Added a tag model and an unit test

* the pet struct now uses no double pointer for it's name anymore and no pointer for the enum status anymore; the pet struct can now be fully converted to json and parsed from json

* Added the struct APIClient and an unit test

* Uncrustified the unit test for category

* Added ifdef in pet.h to prevent errors

* Added one API endpoint to get a pet by id

* Added a "== 0" comparison that I forgot

* Added some kind of debug functionality to test-petApi.c

* Removed the DEBUG define

* Moved the c petstore example from samples/client/c to samples/client/petstore/c

* Renamed function getPetById to petApi_getPetById to avoid name collisions

* Removed unecessary method in list.c

* Added POST functionality; added petApi_addPet method and improved unit-test for petApi; cleaned up some code in apiClient

* removed two methods in list.c(string/tag to JSON) and moved their code directly in the pet_convertToJSON method

* Removed old, already commented out, puts artifact in apiClient.c

* Added a convertToJSON method to the category model

* Added a convertToJSON method to the tag model

* changed how the convertToJSON method works in the pet model

* Adjusted the unit-tests on how the convertToJSON method now works(now returns a cJSON* instead of a char*)

* apiClient_t now needs to be given to API methods as a parameter. This means apiClient_t can now be reused in multiple methods.

* Added an untested concept for how authentication could be handled

* Tested basicAuth using wireshark and added untested OAuth2 feature

* Added support for api key authentication using the http-header and tested functionality using wireshark

* Renamed the dataToPost parameter in apiClient_invoke to bodyParameters

* Renamed apiKey_t to keyValuePair_t and implemented GET queries

* Spaces are now being replaced with + in querryParameters

* Renamed assembleHeader to assembleAPIKeyAuthentication and added support to change the request type

* Implemented the option to provide custom httpHeader fields to apiClient_invoke

* Added support for form parameters to the apiClient_invoke method

* update petstore sample
2018-07-19 12:22:38 +08:00

87 lines
2.3 KiB
C

#include <stdlib.h>
#include <string.h>
#include "apiClient.h"
#include "cJSON.h"
#include "pet.h"
#include "list.h"
#include "keyValuePair.h"
#ifdef DEBUG
#include <stdio.h>
#endif // DEBUG
#define EXAMPLE_OPERATION_NAME "pet"
#define EXAMPLE_OPERATION_PARAMETER "5"
#define EXAMPLE_KEYNAME_1 "MyExampleKey"
#define EXAMPLE_VALUENAME_1 "MyExampleValue"
#define EXAMPLE_KEYNAME_2 "MyExampleKeyTwo"
#define EXAMPLE_VALUENAME_2 "MyExampleValueTwo"
int main() {
apiClient_t *apiClient = apiClient_create();
#ifdef OAUTH2
apiClient->accessToken = "thisIsMyExampleAccessToken";
#endif // OAUTH2
#ifdef API_KEY
apiClient->apiKeys = list_create();
keyValuePair_t *apiKey = apiKey_create("X-API-Key", "abcdef12345");
list_addElement(apiClient->apiKeys, apiKey);
#endif // API_KEY
list_t *customHeaderFields = list_create();
char *keyOne = malloc(strlen(EXAMPLE_KEYNAME_1) + 1);
char *valueOne = malloc(strlen(EXAMPLE_VALUENAME_1) + 1);
strcpy(keyOne, EXAMPLE_KEYNAME_1);
strcpy(valueOne, EXAMPLE_VALUENAME_1);
char *keyTwo = malloc(strlen(EXAMPLE_KEYNAME_2) + 1);
char *valueTwo = malloc(strlen(EXAMPLE_VALUENAME_2) + 1);
strcpy(keyTwo, EXAMPLE_KEYNAME_2);
strcpy(valueTwo, EXAMPLE_VALUENAME_2);
keyValuePair_t *firstCustomField =
keyValuePair_create(keyOne, valueOne);
keyValuePair_t *secondCustomField =
keyValuePair_create(keyTwo, valueTwo);
list_addElement(customHeaderFields, firstCustomField);
list_addElement(customHeaderFields, secondCustomField);
apiClient_invoke(apiClient,
EXAMPLE_OPERATION_NAME,
EXAMPLE_OPERATION_PARAMETER,
NULL,
customHeaderFields,
NULL,
NULL,
NULL);
pet_t *pet = pet_parseFromJSON(apiClient->dataReceived);
if(pet == NULL) {
free(apiClient);
return 0;
} else {
cJSON *petJSONObject = pet_convertToJSON(pet);
#ifdef DEBUG
char *jsonString = cJSON_Print(petJSONObject);
puts(jsonString);
free(jsonString);
#endif
cJSON_Delete(petJSONObject);
}
free(apiClient->dataReceived);
#ifdef API_KEY
free(apiKey);
list_free(apiClient->apiKeys);
#endif // API_KEY
free(keyOne);
free(valueOne);
free(keyTwo);
free(valueTwo);
keyValuePair_free(firstCustomField);
keyValuePair_free(secondCustomField);
list_free(customHeaderFields);
apiClient_free(apiClient);
pet_free(pet);
}