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

REST Follow Redirects

See more REST Examples

Demonstrates how to follow a 302/303 redirect response.

Chilkat React Native Downloads

React Native
import { Rest, Url } from '@chilkat/react-native'

async function chilkatExample() {
  // This example requires the Chilkat API to have been previously unlocked.
  // See Global Unlock Sample for sample code.

  const rest = new Rest();

  const bTls = true;
  const port = 443;
  const bAutoReconnect = true;
  try {
    await rest.connectAsync('chilkatsoft.com', port, bTls, bAutoReconnect);
  } catch {
    console.log(rest.lastErrorText);
    return;
  }

  // Send a POST to a URL that will respond with a 302 redirect..
  rest.addQueryParam('firstName', 'John');
  rest.addQueryParam('lastName', 'Doe');
  let responseText: string;
  try {
    responseText = await rest.fullRequestFormUrlEncodedAsync('POST', '/echoPost302.asp');
  } catch {
    console.log(rest.lastErrorText);
    return;
  }

  const statusCode = rest.responseStatusCode;

  // Examine the response status code
  if (statusCode < 300) {
    console.log('Not a redirect.');
    console.log(responseText);
    return;
  }

  if (statusCode > 399) {
    console.log(`Error response: Status code = ${statusCode}`);
    console.log(responseText);
    return;
  }

  console.log(`Redirect status code = ${statusCode}`);

  // 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.

  console.log(rest.responseHeader);

  // Get the redirect URL
  const urlStr = rest.lastRedirectUrl;
  if (!rest.lastMethodSuccess) {
    console.log('No Location header found for redirect.');
    return;
  }

  const redirectUrl = new Url();
  redirectUrl.parseUrl(urlStr);

  // Prep for the redirect..
  rest.clearAllParts();

  // Disconnect and re-connect.  
  // (This can be skipped if both the host and SSL/TLS conditions are the same.)
  await rest.disconnectAsync(100);
  try {
    await rest.connectAsync(redirectUrl.host, redirectUrl.port, redirectUrl.ssl, bAutoReconnect);
  } catch {
    console.log(rest.lastErrorText);
    return;
  }

  if ((statusCode === 301) || (statusCode === 307)) {
    // Redirect using a POST, sending the same params to the new destination
    rest.addQueryParam('firstName', 'John');
    rest.addQueryParam('lastName', 'Doe');
    try {
      responseText = await rest.fullRequestFormUrlEncodedAsync('POST', redirectUrl.path);
    } catch {
      console.log(rest.lastErrorText);
      return;
    }
  }

  if ((statusCode === 302) || (statusCode === 303)) {
    // Redirect using a GET, sending the query params found in the redirect URL.
    try {
      responseText = await rest.fullRequestFormUrlEncodedAsync('GET', redirectUrl.pathWithQueryParams);
    } catch {
      console.log(rest.lastErrorText);
      return;
    }
  }

  // Show the final status code and the response text.
  console.log(`Final status code = ${rest.responseStatusCode}`);

  console.log('Final response text (HTML, XML, JSON, or whatever..)');
  console.log(responseText);
}