Rust Requires Chilkat v11.0.0+
Rust
REST Follow Redirects
See more REST Examples
Demonstrates how to follow a 302/303 redirect response.Chilkat Rust Downloads
// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
let rest = chilkat::Rest::new();
let b_tls = true;
let port = 443;
let b_auto_reconnect = true;
if rest.connect("chilkatsoft.com", port, b_tls, b_auto_reconnect).is_err() {
println!("{}", rest.last_error_text());
return;
}
// Send a POST to a URL that will respond with a 302 redirect..
let _ = rest.add_query_param("firstName", "John");
let _ = rest.add_query_param("lastName", "Doe");
let Ok(mut response_text) = rest.full_request_form_url_encoded("POST", "/echoPost302.asp") else {
println!("{}", rest.last_error_text());
return;
};
let status_code = rest.response_status_code();
// Examine the response status code
if status_code < 300 {
println!("Not a redirect.");
println!("{}", response_text);
return;
}
if status_code > 399 {
println!("Error response: Status code = {}", status_code);
println!("{}", response_text);
return;
}
println!("Redirect status code = {}", status_code);
// The response header will contain a Location field with the redirect URL, such as this:
// Location: http://www.chilkatsoft.com/echoPostFinal.asp
// The response status code determines how the client should behave.
// Here are some common possibilities:
// 301: Moved Permanently
// This and all future requests should be directed to the given URI. (Keep the original HTTP method for the redirect. In this case, the
// original request was a POST, so we POST to the redirect URL.)
// 302: Found (aka Object Moved aka Moved Temporarily)
// This is the most popular redirect code, but also an example of industrial practice contradicting the standard. HTTP/1.0 specification (RFC 1945 ) required the client
// to perform a temporary redirect (the original describing phrase was �Moved Temporarily�), but popular browsers implemented it as a 303 See Other. Therefore, HTTP/1.1
// added status codes 303 and 307 to disambiguate between the two behaviors. However, the majority of Web applications and frameworks still use the 302 status code
// as if it were the 303.
// 303: See Other
// The response to the request can be found under another URI using a GET method. When received in response to a PUT, it should be assumed that the server has
// received the data and the redirect should be issued with a separate GET message.
// 307: Temporary Redirect
// In this occasion, the request should be repeated with another URI, but future requests can still use the original URI. In contrast to 303, the request method
// should not be changed when reissuing the original request. For instance, a POST request must be repeated using another POST request.
println!("{}", rest.response_header());
// Get the redirect URL
let url_str = rest.last_redirect_url();
if !rest.last_method_success() {
println!("No Location header found for redirect.");
return;
}
let redirect_url = chilkat::Url::new();
let _ = redirect_url.parse_url(&url_str);
// Prep for the redirect..
let _ = rest.clear_all_parts();
// Disconnect and re-connect.
// (This can be skipped if both the host and SSL/TLS conditions are the same.)
let _ = rest.disconnect(100);
if rest.connect(&redirect_url.host(), redirect_url.port(), redirect_url.ssl(), b_auto_reconnect).is_err() {
println!("{}", rest.last_error_text());
return;
}
if (status_code == 301) || (status_code == 307) {
// Redirect using a POST, sending the same params to the new destination
let _ = rest.add_query_param("firstName", "John");
let _ = rest.add_query_param("lastName", "Doe");
response_text = rest.full_request_form_url_encoded("POST", &redirect_url.path()).unwrap_or_default();
if !rest.last_method_success() {
println!("{}", rest.last_error_text());
return;
}
}
if (status_code == 302) || (status_code == 303) {
// Redirect using a GET, sending the query params found in the redirect URL.
response_text = rest.full_request_form_url_encoded("GET", &redirect_url.path_with_query_params()).unwrap_or_default();
if !rest.last_method_success() {
println!("{}", rest.last_error_text());
return;
}
}
// Show the final status code and the response text.
println!("Final status code = {}", rest.response_status_code());
println!("Final response text (HTML, XML, JSON, or whatever..)");
println!("{}", response_text);