我正在尝试使用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
正如您所看到的,它不是完整的数据,只是一些标题。
答案 0 :(得分:0)
这里有几个问题:
1)您收到HTTP 404响应,这意味着在服务器上找不到该资源。所以你需要检查你的请求。
2)您正在切断pos 400处的字符串:
Ethernet::buffer[off + 400] = 0; // if i raise 400 much higher, response will be blank
这就是它在Cache-Control: no
之后停止的原因,它恰好是400字节(字节0-399)。
你可能想要Ethernet::buffer[off + len] = 0;
,但你还需要检查它是否不在界限范围内(即大于你的缓冲区大小 - 这可能就是你得到'空白'响应的原因。)
例如,来自该服务器的404响应如下所示:
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
因此,您的缓冲区必须足够大,以容纳响应标头和数据。
3)在200响应中,我们看到两件事:转移是chunked,并且是gzip(但后者仅在有Accept-Encoding: gzip
标头时发生请求。
处理此问题的最简单方法是发送HTTP / 1.0请求而不是HTTP / 1.1(HTTP / 1.0中不允许/不提供分块传输和gzip)。