질문
cURL을 사용하여 API에 양식 데이터를 게시하려고 합니다.API 문서multipart/form-data
콘텐츠 유형을 허용한다고 선언합니다 .
이것은 스크립트의 일부이므로 문서화되어 있는 세미콜론으로 구분된 양식 필드 문자열을 구성하려고 합니다.cURL 문서에서.
내가 시도한 것
내가 뭘 할까?좋다스크립트에 전달된 매개변수를 기반으로 이 문자열을 쉽게 작성하기 위해 수행할 수 있는 작업은 다음과 같습니다.
local _payload="file=@file;username=name;content=hello"
echo "INFO payload: ${_payload}"
curl -i -F "${_payload}" "${url}"
$ ./myscript.sh <args>
# INFO payload: file=@file;username=name;content=hello -- my script
# Warning: skip unknown form field: username=name -- cURL
# Warning: skip unknown form field: content=hello -- cURL
cURL에서 이러한 경고가 표시되고 예상대로 API는 값을 가져오지 않습니다.
무엇하다작동하는 것은 각 필드를 자체 매개변수로 cURL에 전달하는 것입니다.
curl -i -F "file=@file" -F "username=name" -F "content=hello" "${url}"
...하지만 이는 프로그래밍 방식으로 설명하기에는 적합하지 않습니다.
두 경우 모두 파일이 올바르게 수신되고 처리된다는 점을 지적하기 위해 편집해야 합니다.
질문
이것이 내가 놓친 부분이라고 확신하지만 cURL 문서와 내가 요청하는 API를 자세히 살펴본 후에도 찾을 수 없습니다.cURL이 이러한 양식 필드를 건너뛰는 이유, 어떻게 방지/수정할 수 있나요?
답변1
확실히 Unix.SE에 첫 번째 질문을 게시한 후 저는 돌파구를 찾았습니다. 나는 문서를 다시 읽고 세미콜론으로 구분된 문자열을 잘못 사용하고 있다는 것을 (어쨌든 처음으로) 깨달았습니다.
문서세미콜론은 여러 필드를 구분하는 데 사용되지 않고 동일한 필드의 여러 특성을 구분하는 데 사용됨을 선언합니다. 이것이 내가 잘못한 곳입니다.
API 문서선언 엔드포인트는 URL로 인코딩된 JSON 페이로드를 payload_json
필드로 허용하므로 대신 다음을 수행했습니다.
local _json="payload_json=$(build_json)" # defined elsewhere
local _file="file=@file"
curl -i -F "${_file}" -F "${_json}" "${url}"
알다시피, 그것은 작동합니다. RTFD!