App Center构建上传时Curl POST请求报HTTP 411错误求助
解决App Center curl POST请求的HTTP 411错误
问题描述
尝试通过curl向App Center API发送POST请求初始化构建上传时,收到HTTP 411(Length Required)错误,错误提示请求必须分块或包含内容长度。原curl命令如下:
API_URL="https://api.appcenter.ms/v0.1/apps/$TEAM_APP" AUTH="X-API-Token: $API_TOKEN" ACCEPT_JSON="Accept: application/json" request_url="$API_URL/uploads/releases" upload_json=$(curl -s -X POST -H "Content-Type: application/json" -H "$ACCEPT_JSON" -H "$AUTH" "$request_url")
错误信息:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd"> <HTML><HEAD><TITLE>Length Required</TITLE> <META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD> <BODY><h2>Length Required</h2> <hr><p>HTTP Error 411. The request must be chunked or have a content length.</p> </BODY></HTML>
问题原因
HTTP 411错误的核心原因是:你的POST请求没有携带请求体(body),也未告知服务器内容长度。虽然已设置Content-Type: application/json,但空请求体导致服务器无法确定请求的内容长度,不符合HTTP协议对POST请求的要求。
App Center的/uploads/releases接口需要初始化上传会话,即使无需传递业务参数,也需要发送一个空的JSON对象作为请求体,触发curl自动生成Content-Length头或启用分块传输。
解决方案
修改curl命令,添加空请求体让curl自动处理内容长度,以下两种方式均可:
方式1:发送空JSON对象
使用-d '{}'参数传递空JSON对象,curl会自动计算并添加Content-Length头:
API_URL="https://api.appcenter.ms/v0.1/apps/$TEAM_APP" AUTH="X-API-Token: $API_TOKEN" ACCEPT_JSON="Accept: application/json" request_url="$API_URL/uploads/releases" upload_json=$(curl -s -X POST -H "Content-Type: application/json" -H "$ACCEPT_JSON" -H "$AUTH" -d '{}' "$request_url")
方式2:启用分块传输
若确实不需要请求体,可通过-T -参数让curl启用分块传输,绕过内容长度校验:
API_URL="https://api.appcenter.ms/v0.1/apps/$TEAM_APP" AUTH="X-API-Token: $API_TOKEN" ACCEPT_JSON="Accept: application/json" request_url="$API_URL/uploads/releases" upload_json=$(curl -s -X POST -H "Content-Type: application/json" -H "$ACCEPT_JSON" -H "$AUTH" -T - "$request_url" <<< '')
验证说明
添加-d '{}'后,curl会自动在请求头中添加Content-Length: 2({}的字符长度为2),满足服务器对内容长度的要求,即可解决411错误。
内容的提问来源于stack exchange,提问作者srisindhu saride
相关产品推荐
相关产品推荐

