Sample code for 30+ languages & platforms
Rust Requires Chilkat v11.0.0+

REST Follow Redirects

See more REST Examples

Demonstrates how to follow a 302/303 redirect response.

Chilkat Rust Downloads

Rust

// 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);