2014-04-16 3 views
2

Я хочу получить json с моего сайта. Я пытаюсь отправить запрос POST для проверки подлинности, и после этого я хочу отправить запрос GET для получения json, но я не могу этого сделать, потому что он дает мне ошибку 401 unauthorized (файлы cookie не сохраняются). Как я могу вести сеанс с Arduino, экраном Ethernet и WebClien?Как сохранить сеанс HTTP с экраном arduino ethernet и веб-клиентом

Источник:

#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[] = "https://stackoverflow.com/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\": \"[email protected]\",\"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; 
} 

ответ

0

Для начала, да, Arduino Ethernet способна хранить и отправлять обратно печенье.

Вы должны поймать файлы cookie из запроса аутентификации и отправить их обратно в заголовок второго HTTP-запроса (GET).

Посмотрите информаций о RFC HTTP протокола

Вы также можете посмотреть по адресу: http://en.wikipedia.org/wiki/HTTP_cookie#Setting_a_cookie