2

I want get json from my website. I am trying send POST request for authentication and after it i want to send GET request for getting json, but i can't do it, because it gives me en error 401 unauthorized (cookies doesn't saved) . How can i keep session with Arduino ,ethernet shield and WebClien?

Source:

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

//Change to your server domain
char serverName[] = "bh.quickle.me";

// change to your server's port
int serverPort = 80;

// change to the page on that server
char pageName[] = "/users/sign_in";
char sensorPage[] = "/api/v1/sensors";

EthernetClient client;
int totalCount = 0; 
// insure params is big enough to hold your variables
char params[68];

// set this to the number of milliseconds delay
// this is 30 seconds
#define delayMillis 30000UL

unsigned long thisMillis = 0;
unsigned long lastMillis = 0;

void setup() {
Serial.begin(9600);

// disable SD SPI
pinMode(4,OUTPUT);
digitalWrite(4,HIGH);
pinMode(7,OUTPUT);
digitalWrite(7,HIGH);

Serial.print(F("Starting ethernet..."));
if(!Ethernet.begin(mac)) Serial.println(F("failed"));
else Serial.println(Ethernet.localIP());
delay(2000);
Serial.println(F("Ready"));
sprintf(params,"{\"user\": {\"email\": \"EgorkZe@gmail.com\",\"password\": \"1234asdf\"}}");
postPage(serverName,serverPort,pageName,params);

}

void loop()
{
thisMillis = millis();

if(thisMillis - lastMillis > delayMillis)
{
lastMillis = thisMillis;
getPage(serverName, serverPort, sensorPage);
} 
}

byte postPage(char* domainBuffer,int thisPort,char* page,char* thisData)
{
int inChar;
char outBuf[64];

Serial.print(F("connecting..."));

if(client.connect(domainBuffer,thisPort))
{
Serial.println(F("connected"));

// send the header
sprintf(outBuf,"POST %s HTTP/1.1",page);
client.println(outBuf);
sprintf(outBuf,"Host: %s",domainBuffer);
client.println(outBuf);
client.println(F("Connection: close\r\nContent-Type: application/json"));
sprintf(outBuf,"Content-Length: %u\r\n",strlen(thisData));
client.println(outBuf);

// send the body (variables)
client.print(thisData);
} 
else
{
Serial.println(F("failed"));
return 0;
}

int connectLoop = 0;

while(client.connected())
{
while(client.available())
{
inChar = client.read();
Serial.write(inChar);
connectLoop = 0;
}

delay(1);
connectLoop++;
if(connectLoop > 10000)
{
Serial.println();
Serial.println(F("Timeout"));
client.stop();
}
}

Serial.println();
Serial.println(F("disconnecting."));
client.stop();
return 1;
}

byte getPage(char* domainBuffer, int thisPort, char* page)
{
int inChar;
char outBuf[128];

Serial.print(F("connecting..."));

if(client.connect(domainBuffer,thisPort))
{
Serial.println(F("connected"));

sprintf(outBuf,"GET %s HTTP/1.1",page);
client.println(outBuf);
sprintf(outBuf,"Host: %s",serverName);
client.println(outBuf);
client.println(F("Connection: close\r\n"));
} 
else
{
Serial.println(F("failed"));
return 0;
}

// connectLoop controls the hardware fail timeout
int connectLoop = 0;

while(client.connected())
{
while(client.available())
{
inChar = client.read();
Serial.write(inChar);
// set connectLoop to zero if a packet arrives
connectLoop = 0;
}

connectLoop++;

// if more than 10000 milliseconds since the last packet
if(connectLoop > 10000)
{
// then close the connection from this end.
Serial.println();
Serial.println(F("Timeout"));
client.stop();
}
// this is a delay for the connectLoop timing
delay(1);
}

Serial.println();

Serial.println(F("disconnecting."));
// close client end
client.stop();

return 1;
}  
EgorkZe
  • 391
  • 1
  • 4
  • 15

1 Answers1

1

To begin, yes, the Arduino Ethernet is capable to store and send back cookies.

You have to catch the cookies from the authentication request and send them back in the header of the second HTTP request (the GET one).

Have a look at informations about RFC HTTP Protocol

You can also look at : http://en.wikipedia.org/wiki/HTTP_cookie#Setting_a_cookie

F4T4liS
  • 185
  • 1
  • 1
  • 13