
따라서 Gists(github)에 POST 요청을 보내려면 다음과 같이 할 수 있습니다.https://gist.github.com/caspyi...
curl --user "user" -X POST --data '{"description":"Created via API","public":"true","files":{"file1.txt":{"content":"Demo"}}' https://api.github.com/gists
그런데 위의 예에서는 파일명과 파일 내용이 하드코딩되어 있는 부분이 .. file1.txt":{"content":"Demo"}
..
위 부분을 내 변수로 바꾸지 $file":{"content":"$content"}
만 변수를 초기화합니다. json 요청은 큰따옴표로 묶어야 합니다.
curl --user "user" -X POST --data "{\"description\":\"Created via API\",\"public\":\"true\",\"files\":{\"$file\":{\"content\":\"$content\"}}' https://api.github.com/gists
하지만 이것은 작동하지 않습니다. json 오류가 발생합니다.
{
"message": "Problems parsing JSON",
"documentation_url": "https://developer.github.com/v3/gists/#create-a-gist"
}
심지어 이스케이프된 큰따옴표를 모두 \'
작은따옴표로 바꾼 경우에도 마찬가지입니다.
이 json 요청에 변수를 포함하는 방법을 아는 사람이 있나요? btw: 나는 다음과 같은 모든 헤더를 사용했습니다.
-H "Content-Type: application/json; charset=UTF-8"
요청을 검증하기 위한 많은 조합이 있지만 소용이 없습니다.
업데이트.
전체 내용은 이렇게 생겼습니다.
function gist_controller(){
content=$(cat $1)
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
read -p "enter your password - " pass
public="false"
gist_content=$(cat $1)
curl --user "samserayo" -H "Content-Type: application/json; charset=UTF-8" -X POST -d "{ 'description': 'Created via API', 'public': 'true', 'files':{ ' '$1 ':{ 'content': '$gist_content'}}" https://api.github.com/gists
}
업데이트 2
스크립트를 중단시키는 파일(제가 업로드하려는 파일은)
<?php echo 'hello world' ?>
답변1
$file 또는 $content에 대해 설정한 값은 표시되지 않습니다. 둘 다 무엇으로 확장됩니까? 둘 중 하나 또는 둘 다 JSON 파서가 좋아하지 않는 문자를 포함할 가능성이 높습니다. 컬을 통해 JSON 파서에 제출하기 전에 변수 확장 값 내부의 내용을 추가로 이스케이프하거나 인코딩해야 할 가능성이 높습니다.
환경 변수를 내보냈습니까?
노력하다:
echo "$file $content";
둘 다 예상한 대로 설정되어 있는지 확인하세요.
답변2
사용 중인 쉘을 지정하지 않았지만 큰따옴표 안의 내용은 쉘 파일 이름 확장의 대상이 됩니다. 특히, {}는 대부분의 셸에 의미가 있습니다. 이것이 바로 당신이 인용한 예에서 작은따옴표를 사용하여 모든 것을 포장한 이유입니다.
쉘 이스케이프는 까다롭고 때로는 원하는 것을 얻는 것이 불가능해 보일 때도 있습니다. 솔직히 이런 경우에는 컬을 호출하는 Python 스크립트를 작성할 것입니다. 여기서 쉘은 나를 "도움"하지 않는다는 것을 알고 있습니다.
답변3
검토를 위해 부딪쳤으므로 여기에 또 다른 답변이 있습니다.
부분을 개별적으로 이스케이프하십시오(첫 번째 이스케이프를 닫은 다음 변수를 이스케이프하십시오).
curl --user "user" -X POST --data '{"description":"Created via API","public":"true","files":{"'"${file}"'":{"content":"'"${content}"'"}}}' https://api.github.com/gists
또는 가독성을 위해 분할합니다.
'{"description":"Created via API","public":"true","files":{"'
"${file}"
'":{"content":"'
"${content}"
'"}}}'
내부 필드 구분 기호를 변경해야 할 수도 있고 변경하지 않아도 되므로 쉘은 변수 자체의 공백을 해석하지 않습니다.
MWE:cat /tmp/myfile | ./thisscript.sh "myfilename.txt"
#!/bin/sh
FILENAME="${1}"
#CONTENT="$(cat)"
CONTENT="$(sed -e 's/"/\\"/g')" # escape stuff
OFS="${IFS}"
IFS=''
PERSONAL_ACCESS_TOKEN="e5fa44f2b31c1fb553b6021e7360d07d5d91ff5e"
curl --user "username:${PERSONAL_ACCESS_TOKEN}" -X POST --data '{"description":"Created via API","public":"true","files":{"'"${FILENAME}"'":{"content":"'"${CONTENT}"'"}}}' https://api.github.com/gists
IFS="${OFS}"
이것이 올바르게 작동하려면 물론 JSON을 손상시키는 모든 문자를 이스케이프해야 합니다."
, 제어 문자(DOS 캐리지 리턴) 등과 같은 파일 내용에 포함
됩니다. 불행하게도 그들이 JSON 데이터 구조를 사용하기로 결정했습니다.파일 내용업로드.
Gists를 생성하는 다른 방법을 제안할 수 있다면 API 호출을 사용하여 상용구 콘텐츠(비워둘 수 없음)가 포함된 curl
단일 파일을 생성하세요 . 그런 다음 반환된 json 구조를 grep합니다.README
git_push_url
그리고클론요점 git repo. 그 후에는 바이너리 데이터나 문제 탈출에 대해 걱정하지 않고 요점만 정리할 git commit
수 있습니다.git push
답변4
여기에 해결책이 있지만 두 가지를 가정합니다.
이는 file
스크립트에 첫 번째 인수로 제공된 파일 이름입니다. 그리고 content
파일 내용은 text
.
또한 귀하의 POST URL과 다른 POST URL을 기록해 두십시오(설명은 아래 참조).
#!/bin/bash
file=$1
content=$(cat $1)
curl -H "Content-Type: application/json; charset=UTF-8" -X POST -d "{ 'description': 'Created via API', 'public': 'true', 'files':{ ' '${file}':{ 'content': '${content}'}}" https://postman-echo.com/post
content.txt 파일에는 다음이 포함됩니다.
This is content of the content file.
실행 예시:
./curl.sh content.txt
예제 출력:
{
"args": {},
"data": "{ 'description': 'Created via API', 'public': 'true', 'files':{ ' 'content.txt ':{ 'content': 'This is content of the content file.'}}",
"files": {},
"form": {},
"headers": {
"x-forwarded-proto": "https",
"host": "postman-echo.com",
"content-length": "134",
"accept": "*/*",
"content-type": "application/json; charset=UTF-8",
"user-agent": "curl/7.65.3",
"x-forwarded-port": "443"
},
"json": null,
"url": "https://postman-echo.com/post"
}
노트:
저는 여기에서 https://postman-echo.com/post
귀하가 게시한 모든 내용을 JSON으로 반영하는 웹사이트를 사용하고 있습니다.
content.txt 파일의 내용이 더 복잡한 경우 이 솔루션은 여전히 적절하게 이스케이프되어야 하므로 중단될 수 있습니다. 콘텐츠가 "content" 필드에 배치되므로 json에 대한 모든 이스케이프 규칙이 여기에 적용됩니다.
아름답게 표시된 응답을 보려면(json 위와 같이) 컬 끝에 추가하세요 | jq .
(먼저 설치해야 할 수도 있습니다).
https://postman-echo.com/post | jq .
전체 콘텐츠 파일을 자동으로 인용하는 데 사용할 수 있습니다 jq
(더 고급 사용이 필요한 경우).
$ jq -Rs '.' content.txt
"This is just a text.\n"
$ jq -Rs '.' content.cpp
"#include <iostream>\nusing namespace std;\nint main() \n{\n cout << \"Hello, World!\";\n return 0;\n}\n"
curl.sh
작동하려면 스크립트를 약간 수정해야 합니다 .
content=$(jq -Rs '.' $1)