Gửi ý chính đến github qua cURL và các vấn đề với các dòng mới bên trong tệp


1

Vì vậy, giả sử tôi có một index.phptệp chứa tệp này:

 <?= "Hello" ?>

 <?= echo "WORLD" ?>

Và tôi muốn tải nội dung của tệp này lên các ý chính của mình trong github, mà tôi đang thực hiện thông qua

gist_content=$(cat 'index.php')

curl --user "GITHUB_USER"  -H "Content-Type: application/json; charset=UTF-8" -X POST -d  "{ \"description\": \"Created via API\", \"public\": \"true\", \"files\":{ \"index.php \":{ \"content\": \"$gist_content\"}}\" " https://api.github.com/gists

Bây giờ, tập lệnh này không hoạt động vì một số lý do và tôi nhận được phản hồi lỗi

{
  "message": "Problems parsing JSON",
  "documentation_url": "https://developer.github.com/v3/gists/#create-a-gist"
}

Nếu tôi viết mọi thứ trong một dòng không có thẻ, trích dẫn như hellonó hoạt động tìm

Câu trả lời:


1

Bạn đã có một số lỗi cú pháp trong chuỗi JSON của bạn. Vui lòng kiểm tra và sửa nó. Ví dụ

$ echo "{ \"description\": \"Created via API\", \"public\": \"true\", \"files\":{ \"index.php \":{ \"content\": \"$gist_content\"}}\" " | python -m json.tool
Expecting ',' delimiter: line 1 column 95 (char 94)

Vì vậy, bạn đang thiếu một trong các dấu ngoặc nhọn, bạn đang mở 3, nhưng đóng 2.

Cú pháp đơn giản hóa nên như sau:

$ echo '{"description": "Created via API", "public": "true", "files": { "index.php": { "content": "foo" } } }' | python -m json.tool
{
    "description": "Created via API",
    "files": {
        "index.php": {
            "content": "foo"
        }
    },
    "public": "true"
}

Sau đó, vấn đề thoát khỏi dấu ngoặc kép, nhưng bạn đang thoát nó sai cách, hãy xem: Làm thế nào để thoát dấu ngoặc đơn trong chuỗi trích dẫn đơn? Ví dụ:

$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc

Vì bạn cũng đang nhập tệp bên ngoài bao gồm cả dấu ngoặc kép, bạn cũng nên trích dẫn chúng bằng cách sử dụng các công cụ như sed, v.v. Tương tự với các dòng mới, bạn nên thay đổi chúng thành các ký tự điều khiển thích hợp ( <br>hoặc \n) tùy thuộc vào định dạng dự kiến.

Vì vậy, ví dụ cuối cùng của bạn sẽ như sau:

gist_content=$(cat index.php | sed 's/"/\\"/g' | paste -s -d '\\n' -)
curl --user "GITHUB_USER" -H "Content-Type: application/json; charset=UTF-8" -X POST -d "{"\""description"\"": "\""Created via API"\"", "\""public"\"": "\""true"\"", "\""files"\"": { "\""index.php"\"": { "\""content"\"": "\""$gist_content"\"" } } }" https://api.github.com/gists

Nếu tôi bắt đầu yêu cầu JSON với các trích dẫn đơn thì $gist_contentsẽ không được đánh giá.
samayo

Khi bạn sử dụng với dấu ngoặc kép, bạn cần thoát nó, nhưng việc thoát của bạn không đúng. Hãy để tôi cập nhật bài viết, nhưng máy tính của tôi bị chậm máu. Bạn cần phải làm như thế: " "\"" "để thoát khỏi một trích dẫn kép. Thứ hai, JSON của bạn có dấu ngoặc số không đều hoặc một cái gì đó.
kenorb

Tôi đang nói, nếu tôi sử dụng dấu ngoặc đơn thì biến bash $ sẽ không được đọc. Bạn có thể thử và sau đó cho tôi biết, nếu nó hoạt động cho bạn
samayo

@samayo Tôi biết, tôi chỉ nói rằng bạn đã mắc lỗi cú pháp trong JSON của mình, vì vậy bạn có thể làm phần còn lại. Tôi chỉ đơn giản hóa ví dụ để bạn chỉ cho bạn định dạng JSON hợp lệ là gì và tôi đã giải thích vấn đề ở đâu, để bạn có thể tự khắc phục bằng cách hiểu vấn đề. Bạn chỉ là một lỗi đánh máy, thế thôi.
kenorb

như tôi đã nói, ví dụ cuối cùng của bạn cho tôi cùng một lỗi tôi đã đăng trong câu hỏi. Đó là một tình huống khó khăn.
samayo

1

Bạn có thể sử dụng giải pháp này để thay thế các dòng mới, Ngoài ra, bạn phải thoát dấu ngoặc kép trong trường content& description:

#!/bin/bash

ACCESS_TOKEN="YOUR_ACCESSS_TOKEN"

description="the description for this gist. There are also some quotes 'here' and \"here\" in that description"
public="true"
filename="index.php"

desc=$(echo "$description" | sed 's/"/\\"/g' | sed ':a;N;$!ba;s/\n/\\n/g')
json=$(cat index.php | sed 's/"/\\"/g' | sed ':a;N;$!ba;s/\n/\\n/g')

curl -v -H "Content-Type: text/json; charset=utf-8" \
        -H "Authorization: Token $ACCESS_TOKEN" \
        -X POST https://api.github.com/gists -d @- << EOF
{ 
  "description": "$desc", 
  "public": "$public", 
  "files": { 
      "$filename" : { 
          "content": "$json"
       } 
   } 
}
EOF
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.