////
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at
  http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
////
:documentationPath: /plugins/actions/
:language: en_US
:page-alternativeEditUrl: https://github.com/apache/incubator-hop/edit/master/plugins/actions/http/src/main/doc/http.adoc
= Http Get

== Description

Use the HTTP action to retrieve a file from a Web server using the HTTP protocol. This workflow action could be used to access data on partner Web sites. For example, the daily data export or daily list of customers is located at a specified Web site. Also, SaaS providers may give you a URL to locate a report. You can call that URL to retrieve an Excel file or zip file that contains the data. Salesforce requires that you use SOAP APIs to retrieve data.

If HTTP traffic is too heavy in your corporate environment, you may choose to use a proxy server with HTTP authentication.

== Options

=== General Tab

[width="90%", options="header"]
|===
|Option|Description
|Workflow action name|The name of the workflow action.
|URL|The HTTP URL of the file to retrieve, or the directory name to store an uploaded file to.
|Run for every result row?|Check this if you want to run this action for every row that was generated by a previous pipeline. Use the "Copy rows to result". If selected, an HTTP request will be made for each result. Otherwise, the file is only retrieved once
|Input field which contains URL|If the "Run for every result row?" option is selected, the field specified here will determine the file URL for each row
|Input field which contains upload file name|If the "Run for every result row?" option is selected, the field specified here will determine the local file that will be uploaded to the URL associated with the "Input field which contains URL" field.
|Input field which contains destination file name|If the "Run for every result row?" option is selected, the field specified here will determine the local file where the result downloaded from the URL associated with the "Input field which contains URL" field.
|Username|If the site requires authentication, use this username to log in
|Password|If a username is defined, this is the password for it
|Proxy server for upload|The URL of a proxy server that you want to connect to the HTTP URL through
|Proxy port|If a proxy server is defined, this is the port number it listens on
|Ignore proxy for hosts|A regular expression list of exceptions for proxy redirection. This may be useful when working on an intranet or VPN
|Upload file|If you are uploading a file, this will be its name on the remote server
|Target file|If you are downloading a file, this its name on your local filesystem
|Append to specified target file?|If selected, and if the target file already exists, Hop will append all new data to the end of the file
|Add date and time to file name?|If selected, the date and time of the HTTP request (in yyyMMdd_HHmmss format) will be added to the target filename
|Target file extension|If the previous option is selected, this field specifies the extension (letters after the dot) of the target filename
|Add filename to result filename|Any files that are copied will appear as a result from this action; shows a list of files that were copied in this action. 
|===

=== Headers Tab

[width="90%", options="header"]
|===
|Option|Description
|#|Order that the header should be processed
|Name|The name of this HTTP header
|Value|The actual header value to pass 
|===