Advertisement
Guest User

Untitled

a guest
Dec 27th, 2017
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.32 KB | None | 0 0
  1. /*
  2. * compilation:
  3. * gcc this_file.c -lcurl -ljansson
  4. */
  5.  
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <jansson.h>
  9. #include <curl/curl.h>
  10.  
  11. #define BUFFER_SIZE (256 * 1024) /* 256 KB */
  12.  
  13. struct write_result
  14. {
  15. char *data;
  16. int pos;
  17. };
  18.  
  19. static size_t write_response(void *ptr, size_t size, size_t nmemb, void *stream)
  20. {
  21. struct write_result *result = (struct write_result *)stream;
  22.  
  23. if(result->pos + size * nmemb >= BUFFER_SIZE - 1)
  24. {
  25. fprintf(stderr, "error: too small buffer\n");
  26. return 0;
  27. }
  28.  
  29. memcpy(result->data + result->pos, ptr, size * nmemb);
  30. result->pos += size * nmemb;
  31.  
  32. return size * nmemb;
  33. }
  34.  
  35. static char *request(const char *url)
  36. {
  37. CURL *curl = NULL;
  38. CURLcode status;
  39. struct curl_slist *headers = NULL;
  40. char *data = NULL;
  41. long code;
  42.  
  43. curl_global_init(CURL_GLOBAL_ALL);
  44. curl = curl_easy_init();
  45. if(!curl)
  46. goto error;
  47.  
  48. data = malloc(BUFFER_SIZE);
  49. if(!data)
  50. goto error;
  51.  
  52. struct write_result write_result = {
  53. .data = data,
  54. .pos = 0
  55. };
  56.  
  57. curl_easy_setopt(curl, CURLOPT_URL, url);
  58.  
  59. headers = curl_slist_append(headers, "User-Agent: Jansson-Tutorial");
  60. curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
  61.  
  62. curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_response);
  63. curl_easy_setopt(curl, CURLOPT_WRITEDATA, &write_result);
  64.  
  65. status = curl_easy_perform(curl);
  66. if(status != 0)
  67. {
  68. fprintf(stderr, "error: unable to request data from %s:\n", url);
  69. fprintf(stderr, "%s\n", curl_easy_strerror(status));
  70. goto error;
  71. }
  72.  
  73. curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code);
  74. if(code != 200)
  75. {
  76. fprintf(stderr, "error: server responded with code %ld\n", code);
  77. goto error;
  78. }
  79.  
  80. curl_easy_cleanup(curl);
  81. curl_slist_free_all(headers);
  82. curl_global_cleanup();
  83.  
  84. /* zero-terminate the result */
  85. data[write_result.pos] = '\0';
  86.  
  87. return data;
  88.  
  89. error:
  90. if(data)
  91. free(data);
  92. if(curl)
  93. curl_easy_cleanup(curl);
  94. if(headers)
  95. curl_slist_free_all(headers);
  96. curl_global_cleanup();
  97. return NULL;
  98. }
  99.  
  100. int main(int argc, char *argv[])
  101. {
  102. size_t i, j;
  103. char *text;
  104. char *url = "https://api.hh.ru/industries";
  105. char *api_name = "industries";
  106.  
  107. json_t *root;
  108. json_error_t error;
  109.  
  110. text = request(url);
  111. if(!text)
  112. return 1;
  113.  
  114. root = json_loads(text, 0, &error);
  115. free(text);
  116.  
  117. if(!root)
  118. {
  119. fprintf(stderr, "error: on line %d: %s\n", error.line, error.text);
  120. return 1;
  121. }
  122.  
  123. if(!json_is_array(root))
  124. {
  125. fprintf(stderr, "error: root is not an array\n");
  126. json_decref(root);
  127. return 1;
  128. }
  129.  
  130. for(i = 0; i < json_array_size(root); i++)
  131. {
  132. json_t *item_0, *item_1, *name_0, *name_1;
  133.  
  134. item_0 = json_array_get(root, i);
  135. if(!json_is_object(item_0))
  136. {
  137. fprintf(stderr, "error: list item %d is not an object\n", (int)(i + 1));
  138. json_decref(root);
  139. return 1;
  140. }
  141.  
  142. name_0 = json_object_get(item_0, "name");
  143. if(!json_is_string(name_0))
  144. {
  145. fprintf(stderr, "error: list %d: name_0 is not a string\n", (int)(i + 1));
  146. return 1;
  147. }
  148. printf("%s\n", json_string_value(name_0));
  149.  
  150. item_1 = json_object_get(item_0, api_name);
  151. if(!json_is_array(item_1))
  152. {
  153. fprintf(stderr, "error: list %d: item_1 is not an array\n", (int)(i + 1));
  154. json_decref(root);
  155. return 1;
  156. }
  157. for(j = 0; j < json_array_size(item_1); j++)
  158. {
  159. json_t *o = json_array_get(item_1, j);
  160. if(!json_is_object(o))
  161. {
  162. fprintf(stderr, "error: list %d: o is not a object\n", (int)(i + 1));
  163. return 1;
  164. }
  165. name_1 = json_object_get(o, "name");
  166. if(!json_is_string(name_1))
  167. {
  168. fprintf(stderr, "error: list %d: name_1 is not a string\n", (int)(i + 1));
  169. return 1;
  170. }
  171. printf(" %s\n", json_string_value(name_1));
  172. }
  173.  
  174. }
  175.  
  176. json_decref(root);
  177. return 0;
  178. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement