2017-01-05 3 views
-1

Благодарим вас за то, что я потратил 2 дня на это. Вот работающая команда curl.GOLANG - exec.Command Эквивалентные переменные с полезной нагрузкой JSON

curl -ku login:pass -X POST -H 'Content-Type: application/json'-d'{"type":"page","title":"Testpage","space":{"key":"ITDept"},"body":{"storage":{"value":"<p>Blank Page.</p>","representation":"storage"}}}' https://confluence/rest/api/content 

Мне нужно, чтобы это выполнило с exec.Command.

Учитывая, что сейчас в Go я попытался убежать и всевозможные другие способы заставить это работать. Проблема более чем вероятно, эта смешная строка JSON, которая требуется. У меня есть строка JSON, сохраненная в var, чтобы попробовать это.

jsonPayload := '{"type":"page","title":"Testpage","space":{"key":"ITDept"},"body":{"storage":{"value":"<p>Blank Page.</p>","representation":"storage"}}}' 

execCmd := "bash", "-c", "curl -ku login:pass -X POST -H 'Content-Type: application/json' -d" jsonPayload "https://confluence/rest/api/content" 

Таким образом, jsonPayload является аргументом в -d. Я пробовал это, используя маршал json/encoding и net/http-пакет, и он проходит, но что-то о том, как это отправляет stdlib, заставляет API заявить, что это неправильный формат.

Я также пробовал это с этим, и завиток, скопированный из println, но когда на самом деле бежал в golang, он терпел неудачу с неправильным форматом.

env := os.Environ() 
    curlCmd, err := exec.LookPath("curl") 
    if err != nil { 
     fmt.Println("Path not found to binary!") 
     panic(err) 
    } 
args := []string{"curl", "-ku", "login:pass", "-X", "POST", "-H", "'Content-Type: application/json'", "-d", payloadJson, "https://confluence/rest/api/content"} 

execErr := syscall.Exec(curlcmd, args, env) 
    if execErr != nil { 
     panic(execErr) 
} 
fmt.Println(curlCmd) 

Когда curlCmd от этой последней строки выводит его можно скопировать и вставить в терминал, и он работает, однако при прохождении через golang он приходит с форматом не поддерживается. Любая помощь будет принята с благодарностью.

ответ

1

Попробуйте это:

payload := `{"type":"page","title":"Testpage","space":{"key":"ITDept"},"body":{"storage":{"value":"<p>Blank Page.</p>","representation":"storage"}}}` 
cmd := exec.Command("curl", "-ku", "login:pass", "-X", "POST", "-H", "Content-Type: application/json", "-d", payload, "http://localhost:8080/confluence/rest/api/content") 
p, err := cmd.CombinedOutput() 
if err != nil { 
    log.Fatal(err) 
} 
fmt.Printf("%s\n", p) 

Важное изменение от кода в вопросе:

  • команду Выполнить непосредственно, вместо использования Баш.
  • Укажите имя хоста по адресу.
  • Правильно укажите строку.

Кстати, вы можете также интерпретировать строковый литерал:

payload := "{\"type\":\"page\",\"title\":\"Testpage\",\"space\":{\"key\":\"ITDept\"},\"body\":{\"storage\":{\"value\":\"<p>Blank Page.</p>\",\"representation\":\"storage\"}}}" 
+0

Я дам ему выстрелили и доложить. – RedBloodMage

+0

Нечетный, поэтому ему нужны обратные ", но они не появляются в завитке, когда я fmt.Println (cmd). Таким образом, завиток выглядит так. curl -ku login: pass -X POST -H 'Content-Type: application/json'-d {"type": "page", "title": "Testpage", "space": {"key": "ITDept "}," body ": {" storage ": {" value ":"

Пустая страница.

"," представление ":" storage "}}} https: // confluence/rest/api/content, и для этого требуется backticks вокруг полезной нагрузки. Знаете ли вы, как я могу получить те, которые появляются, как в полезной нагрузке, которую вы имеете выше, имеют '' вокруг внешнего {} полезной нагрузки var. По какой-то причине их снимают. – RedBloodMage

+0

Backticks ограничивают [raw string literal] (https://golang.org/ref/spec#String_literals). Как и во всех строковых литералах, разделители не являются частью строки. –