2017-01-20 7 views
2

EtherCardライブラリでHTTPリクエストを作成しようとしていて、完全な応答を得ようとしています。例のコードを使用すると、ヘッダーをキャプチャすることしかできず、突然切断されます。問題は、データを格納するのに十分な大きさのバッファを作成することはできませんが、データは切り捨てられることになります。しかしそれはわずか292バイトです。ここでデータを適合させるためにバッファを調整できません

は、私はサンプルコードが何をしているのか理解しようと尋ねた別の質問である:ここではWhat is happening in this C/Arduino code?

私が取得しようとしているデータです:http://jsonplaceholder.typicode.com/posts/1

String response; 
byte Ethernet::buffer[800]; // if i raise this to 1000, response will be blank 

static void response_handler (byte status, word off, word len) { 
    Serial.println("Response:"); 
    Ethernet::buffer[off + 400] = 0; // if i raise 400 much higher, response will be blank 
    response = String((char*) Ethernet::buffer + off); 
    Serial.println(response); 
} 

は何のために上記のコメントを参照してください。私は試みました。ここで

は、上記のコードから出力された:あなたが見ることができるように

Response: 
HTTP/1.1 404 Not Found 
Date: Fri, 20 Jan 2017 12:15:19 GMT 
Content-Type: application/json; charset=utf-8 
Content-Length: 2 
Connection: close 
Set-Cookie: __cfduid=d9714bd94284b999ceb0e87bc91705d501484914519; expires=Sat, 20-Jan-18 12:15:19 GMT; path=/; domain=.typicode.com; HttpOnly 
X-Powered-By: Express 
Vary: Origin, Accept-Encoding 
Access-Control-Allow-Credentials: true 
Cache-Control: no 

、それは完全なデータ、ヘッダの一部だけではありません。

+1

'String((char *)Ethernet :: buffer + off)'は間違っています私はあなたが 'String((char *)Ethernet :: buffer)'ではないと確信していますか? – NathanOliver

+2

エラー404が戻ってきて、内容は2バイト( 'Content-Length:2')です。 sometをやっているそれ以外は間違っています。 –

+1

あなたは症状を誤解しています - それは内容全体であり、あなたの要求は間違っています。 HTTPヘッダーとエラーコードを紹介してください。 – molbdnilo

答えて

0

はここにいくつかの問題があります。

1)あなたがサーバー上に見つかりませんでしたリソースを意味HTTP 404応答を取得します。だからあなたの要求を確認する必要があります。

2)あなたはposの400で文字列を切断されています

それは正確に400バイト(バイト0から399)である、 Cache-Control: no後に停止した理由です
Ethernet::buffer[off + 400] = 0; // if i raise 400 much higher, response will be blank 

おそらくEthernet::buffer[off + len] = 0;が必要ですが、範囲外でないか(つまり、バッファサイズよりも大きいかどうかを確認する必要があります。これはおそらく「空白」の応答です)。

HTTP/1.1 404 Not Found 
Date: Mon, 23 Jan 2017 07:00:00 GMT 
Content-Type: application/json; charset=utf-8 
Content-Length: 2 
Connection: keep-alive 
x-powered-by: Express 
Vary: Accept-Encoding 
Access-Control-Allow-Credentials: true 
Cache-Control: no-cache 
Pragma: no-cache 
Expires: -1 
x-content-type-options: nosniff 
Etag: W/"2-mZFLkyvTelC5g8XnyQrpOw" 
Via: 1.1 vegur 
CF-Cache-Status: MISS 
Server: cloudflare-nginx 
CF-RAY: 32595301c275445d-xxx 

{} 

と(ブラウザからの)200のレスポンスヘッダ:

HTTP/1.1 200 OK 
Date: Mon, 23 Jan 2017 07:00:00 GMT 
Content-Type: application/json; charset=utf-8 
Transfer-Encoding: chunked 
Connection: keep-alive 
x-powered-by: Express 
Vary: Accept-Encoding 
Access-Control-Allow-Credentials: true 
Cache-Control: public, max-age=14400 
Pragma: no-cache 
Expires: Mon, 23 Jan 2017 10:59:01 GMT 
x-content-type-options: nosniff 
Etag: W/"124-yv65LoT2uMHrpn06wNpAcQ" 
Via: 1.1 vegur 
CF-Cache-Status: HIT 
Server: cloudflare-nginx 
CF-RAY: 32595c4ff39b445d-xxx 
Content-Encoding: gzip 

だからあなたのバッファが十分に大きくする必要があります例えば

、そのサーバーからの404の応答は次のようになります応答ヘッダーとデータの両方を保持します。我々は2つの物事を見る200に応答して

3):転送がchunkedであり、gzip圧縮され(ただし、要求にAccept-Encoding: gzipヘッダがある場合、後者のみ起こる

これを処理する最も簡単な方法HTTP/1.1の代わりにHTTP/1.0要求を送信することです(チャンク転送とgzipはHTTP/1.0では使用できません)。

関連する問題