HTTPRequest.xml 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <class name="HTTPRequest" inherits="Node" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
  3. <brief_description>
  4. A node with the ability to send HTTP(S) requests.
  5. </brief_description>
  6. <description>
  7. A node with the ability to send HTTP requests. Uses [HTTPClient] internally.
  8. Can be used to make HTTP requests, i.e. download or upload files or web content via HTTP.
  9. [b]Warning:[/b] See the notes and warnings on [HTTPClient] for limitations, especially regarding SSL security.
  10. [b]Example of contacting a REST API and printing one of its returned fields:[/b]
  11. [codeblock]
  12. func _ready():
  13. # Create an HTTP request node and connect its completion signal.
  14. var http_request = HTTPRequest.new()
  15. add_child(http_request)
  16. http_request.connect("request_completed", self, "_http_request_completed")
  17. # Perform a GET request. The URL below returns JSON as of writing.
  18. var error = http_request.request("https://httpbin.org/get")
  19. if error != OK:
  20. push_error("An error occurred in the HTTP request.")
  21. # Perform a POST request. The URL below returns JSON as of writing.
  22. # Note: Don't make simultaneous requests using a single HTTPRequest node.
  23. # The snippet below is provided for reference only.
  24. var body = to_json({"name": "Godette"})
  25. error = http_request.request("https://httpbin.org/post", [], true, HTTPClient.METHOD_POST, body)
  26. if error != OK:
  27. push_error("An error occurred in the HTTP request.")
  28. # Called when the HTTP request is completed.
  29. func _http_request_completed(result, response_code, headers, body):
  30. var response = parse_json(body.get_string_from_utf8())
  31. # Will print the user agent string used by the HTTPRequest node (as recognized by httpbin.org).
  32. print(response.headers["User-Agent"])
  33. [/codeblock]
  34. [b]Example of loading and displaying an image using HTTPRequest:[/b]
  35. [codeblock]
  36. func _ready():
  37. # Create an HTTP request node and connect its completion signal.
  38. var http_request = HTTPRequest.new()
  39. add_child(http_request)
  40. http_request.connect("request_completed", self, "_http_request_completed")
  41. # Perform the HTTP request. The URL below returns a PNG image as of writing.
  42. var error = http_request.request("https://via.placeholder.com/512")
  43. if error != OK:
  44. push_error("An error occurred in the HTTP request.")
  45. # Called when the HTTP request is completed.
  46. func _http_request_completed(result, response_code, headers, body):
  47. var image = Image.new()
  48. var error = image.load_png_from_buffer(body)
  49. if error != OK:
  50. push_error("Couldn't load the image.")
  51. var texture = ImageTexture.new()
  52. texture.create_from_image(image)
  53. # Display the image in a TextureRect node.
  54. var texture_rect = TextureRect.new()
  55. add_child(texture_rect)
  56. texture_rect.texture = texture
  57. [/codeblock]
  58. </description>
  59. <tutorials>
  60. <link>$DOCS_URL/tutorials/networking/http_request_class.html</link>
  61. <link>$DOCS_URL/tutorials/networking/ssl_certificates.html</link>
  62. </tutorials>
  63. <methods>
  64. <method name="cancel_request">
  65. <return type="void" />
  66. <description>
  67. Cancels the current request.
  68. </description>
  69. </method>
  70. <method name="get_body_size" qualifiers="const">
  71. <return type="int" />
  72. <description>
  73. Returns the response body length.
  74. [b]Note:[/b] Some Web servers may not send a body length. In this case, the value returned will be [code]-1[/code]. If using chunked transfer encoding, the body length will also be [code]-1[/code].
  75. </description>
  76. </method>
  77. <method name="get_downloaded_bytes" qualifiers="const">
  78. <return type="int" />
  79. <description>
  80. Returns the amount of bytes this HTTPRequest downloaded.
  81. </description>
  82. </method>
  83. <method name="get_http_client_status" qualifiers="const">
  84. <return type="int" enum="HTTPClient.Status" />
  85. <description>
  86. Returns the current status of the underlying [HTTPClient]. See [enum HTTPClient.Status].
  87. </description>
  88. </method>
  89. <method name="request">
  90. <return type="int" enum="Error" />
  91. <argument index="0" name="url" type="String" />
  92. <argument index="1" name="custom_headers" type="PoolStringArray" default="PoolStringArray( )" />
  93. <argument index="2" name="ssl_validate_domain" type="bool" default="true" />
  94. <argument index="3" name="method" type="int" enum="HTTPClient.Method" default="0" />
  95. <argument index="4" name="request_data" type="String" default="&quot;&quot;" />
  96. <description>
  97. Creates request on the underlying [HTTPClient]. If there is no configuration errors, it tries to connect using [method HTTPClient.connect_to_host] and passes parameters onto [method HTTPClient.request].
  98. Returns [constant OK] if request is successfully created. (Does not imply that the server has responded), [constant ERR_UNCONFIGURED] if not in the tree, [constant ERR_BUSY] if still processing previous request, [constant ERR_INVALID_PARAMETER] if given string is not a valid URL format, or [constant ERR_CANT_CONNECT] if not using thread and the [HTTPClient] cannot connect to host.
  99. [b]Note:[/b] When [code]method[/code] is [constant HTTPClient.METHOD_GET], the payload sent via [code]request_data[/code] might be ignored by the server or even cause the server to reject the request (check [url=https://datatracker.ietf.org/doc/html/rfc7231#section-4.3.1]RFC 7231 section 4.3.1[/url] for more details). As a workaround, you can send data as a query string in the URL. See [method String.http_escape] for an example.
  100. </description>
  101. </method>
  102. <method name="request_raw">
  103. <return type="int" enum="Error" />
  104. <argument index="0" name="url" type="String" />
  105. <argument index="1" name="custom_headers" type="PoolStringArray" default="PoolStringArray( )" />
  106. <argument index="2" name="ssl_validate_domain" type="bool" default="true" />
  107. <argument index="3" name="method" type="int" enum="HTTPClient.Method" default="0" />
  108. <argument index="4" name="request_data_raw" type="PoolByteArray" default="PoolByteArray( )" />
  109. <description>
  110. Creates request on the underlying [HTTPClient] using a raw array of bytes for the request body. If there is no configuration errors, it tries to connect using [method HTTPClient.connect_to_host] and passes parameters onto [method HTTPClient.request].
  111. Returns [constant OK] if request is successfully created. (Does not imply that the server has responded), [constant ERR_UNCONFIGURED] if not in the tree, [constant ERR_BUSY] if still processing previous request, [constant ERR_INVALID_PARAMETER] if given string is not a valid URL format, or [constant ERR_CANT_CONNECT] if not using thread and the [HTTPClient] cannot connect to host.
  112. </description>
  113. </method>
  114. <method name="set_http_proxy">
  115. <return type="void" />
  116. <argument index="0" name="host" type="String" />
  117. <argument index="1" name="port" type="int" />
  118. <description>
  119. Sets the proxy server for HTTP requests.
  120. The proxy server is unset if [code]host[/code] is empty or [code]port[/code] is -1.
  121. </description>
  122. </method>
  123. <method name="set_https_proxy">
  124. <return type="void" />
  125. <argument index="0" name="host" type="String" />
  126. <argument index="1" name="port" type="int" />
  127. <description>
  128. Sets the proxy server for HTTPS requests.
  129. The proxy server is unset if [code]host[/code] is empty or [code]port[/code] is -1.
  130. </description>
  131. </method>
  132. </methods>
  133. <members>
  134. <member name="body_size_limit" type="int" setter="set_body_size_limit" getter="get_body_size_limit" default="-1">
  135. Maximum allowed size for response bodies ([code]-1[/code] means no limit). When only small files are expected, this can be used to prevent disallow receiving files that are too large, preventing potential denial of service attacks.
  136. </member>
  137. <member name="download_chunk_size" type="int" setter="set_download_chunk_size" getter="get_download_chunk_size" default="65536">
  138. The size of the buffer used and maximum bytes to read per iteration. See [member HTTPClient.read_chunk_size].
  139. Set this to a lower value (e.g. 4096 for 4 KiB) when downloading small files to decrease memory usage at the cost of download speeds.
  140. </member>
  141. <member name="download_file" type="String" setter="set_download_file" getter="get_download_file" default="&quot;&quot;">
  142. The file to download into. If set to a non-empty string, the request output will be written to the file located at the path. If a file already exists at the specified location, it will be overwritten as soon as body data begins to be received.
  143. [b]Note:[/b] Folders are not automatically created when the file is created. If [member download_file] points to a subfolder, it's recommended to create the necessary folders beforehand using [method Directory.make_dir_recursive] to ensure the file can be written.
  144. </member>
  145. <member name="max_redirects" type="int" setter="set_max_redirects" getter="get_max_redirects" default="8">
  146. Maximum number of allowed redirects. This is used to prevent endless redirect loops.
  147. </member>
  148. <member name="timeout" type="float" setter="set_timeout" getter="get_timeout" default="0.0">
  149. If set to a value greater than [code]0.0[/code] before the request starts, the HTTP request will time out after [code]timeout[/code] seconds have passed and the request is not [i]completed[/i] yet. For small HTTP requests such as REST API usage, set [member timeout] to a value between [code]10.0[/code] and [code]30.0[/code] to prevent the application from getting stuck if the request fails to get a response in a timely manner. For file downloads, leave this to [code]0.0[/code] to prevent the download from failing if it takes too much time.
  150. </member>
  151. <member name="use_threads" type="bool" setter="set_use_threads" getter="is_using_threads" default="false">
  152. If [code]true[/code], multithreading is used to improve performance.
  153. </member>
  154. </members>
  155. <signals>
  156. <signal name="request_completed">
  157. <argument index="0" name="result" type="int" />
  158. <argument index="1" name="response_code" type="int" />
  159. <argument index="2" name="headers" type="PoolStringArray" />
  160. <argument index="3" name="body" type="PoolByteArray" />
  161. <description>
  162. Emitted when a request is completed.
  163. </description>
  164. </signal>
  165. </signals>
  166. <constants>
  167. <constant name="RESULT_SUCCESS" value="0" enum="Result">
  168. Request successful.
  169. </constant>
  170. <constant name="RESULT_CHUNKED_BODY_SIZE_MISMATCH" value="1" enum="Result">
  171. </constant>
  172. <constant name="RESULT_CANT_CONNECT" value="2" enum="Result">
  173. Request failed while connecting.
  174. </constant>
  175. <constant name="RESULT_CANT_RESOLVE" value="3" enum="Result">
  176. Request failed while resolving.
  177. </constant>
  178. <constant name="RESULT_CONNECTION_ERROR" value="4" enum="Result">
  179. Request failed due to connection (read/write) error.
  180. </constant>
  181. <constant name="RESULT_SSL_HANDSHAKE_ERROR" value="5" enum="Result">
  182. Request failed on SSL handshake.
  183. </constant>
  184. <constant name="RESULT_NO_RESPONSE" value="6" enum="Result">
  185. Request does not have a response (yet).
  186. </constant>
  187. <constant name="RESULT_BODY_SIZE_LIMIT_EXCEEDED" value="7" enum="Result">
  188. Request exceeded its maximum size limit, see [member body_size_limit].
  189. </constant>
  190. <constant name="RESULT_REQUEST_FAILED" value="8" enum="Result">
  191. Request failed (currently unused).
  192. </constant>
  193. <constant name="RESULT_DOWNLOAD_FILE_CANT_OPEN" value="9" enum="Result">
  194. HTTPRequest couldn't open the download file.
  195. </constant>
  196. <constant name="RESULT_DOWNLOAD_FILE_WRITE_ERROR" value="10" enum="Result">
  197. HTTPRequest couldn't write to the download file.
  198. </constant>
  199. <constant name="RESULT_REDIRECT_LIMIT_REACHED" value="11" enum="Result">
  200. Request reached its maximum redirect limit, see [member max_redirects].
  201. </constant>
  202. <constant name="RESULT_TIMEOUT" value="12" enum="Result">
  203. </constant>
  204. </constants>
  205. </class>