2009-12-12 61 views
1

我在.sh文件中使用了捲曲語法。我需要在Java中運行curl sytnax或curl命令來複制相同的語法,但我在複製相同的語法時遇到問題。Java中的捲曲語法模擬

$AUTH_OPTION="--basic -u testuser:testpwd" 
$HTTP_METHOD=POST 
$FILE_OPTION="-d @$INPUT_FILE" 
$CONTENT_TYPE="application/xml" 
$ACCEPT_TYPE="application/xml" 

echo curl -o response.txt -w %{http_code} -k -v $AUTH_OPTION -X $HTTP_METHOD $FILE_OPTION -H \"Content-Type: $CONTENT_TYPE\" -H \"Accept: $ACCEPT_TYPE\" 

我有相應的Java代碼:

StringBuffer curlCmd=new StringBuffer(); 
curlCmd.append("curl -o response.txt"); 
curlCmd.append(WHITE_SPACE); 
curlCmd.append("-w %{http_code}"); 
curlCmd.append("-k -v -u testuser:testpwd"); 
curlCmd.append(WHITE_SPACE); 
curlCmd.append("-X POST"); 
curlCmd.append(WHITE_SPACE); 
curlCmd.append("-d @/test/xyz/xml"); 
curlCmd.append(WHITE_SPACE); 
curlCmd.append("-H"+"Content-type: application/xml"); 
curlCmd.append(WHITE_SPACE); 
curlCmd.append("-H"+" Accept: application/xml"); 
curlCmd.append(WHITE_SPACE); 

這並不似乎工作:它不是模擬.SH捲曲語法相同的行爲。任何人都可以幫我解決這個問題嗎?

輸出 curl -o response.txt -w%{http_code} -k -v -u testuser:testpwd -X POST -d @/path/xyz.xml -H「Content-Type:application/xml」 -H「接受:應用程序/ XML」 問題是XML是沒有得到正確訪問

+0

'--basic'發生了什麼? – 2009-12-12 10:56:29

+0

我已經使用過--basic也是,但是這個alos似乎不起作用 – sarah 2009-12-12 11:05:47

+0

發佈'echo curl -o response.txt -w%{http_code} -k -v $ AUTH_OPTION -X $ HTTP_METHOD $ FILE_OPTION -H \ 「內容類型:$ CONTENT_TYPE \」-H \「接受:$ ACCEPT_TYPE \」'和'System.out(curlCmd.toString());' – 2009-12-12 11:10:56

回答

0

我認爲有幾個可能出現的問題,而是一個映入我眼簾的是你缺少引號Content-Type: $CONTENT_TYPEAccept: $ACCEPT_TYPE,爲例如:

"-H \"Content-type: application/xml\"" 

第二個錯誤是你寫的-d @/test/xyz/xml但它應該是:

-d @/test/xyz.xml 

如果仍不能正常工作,你能發佈兩個sh腳本的輸出和你的StringBuffer的,所以我們可以更容易地看到那裏的差異?

+0

我已經使用過所說的語法,但問題仍然存在。 我越來越badrequest錯誤,我想運行這個程序在Linux使用運行時api – sarah 2009-12-12 11:05:13

+0

我認爲你應該而不是執行該命令,嘗試顯示它到System.out或在調試器中查看它。如果你這樣做,那麼可能很明顯會出現什麼問題。如果沒有,發佈你在這裏得到的字符串,有人會很快告訴你要修復的東西。如果你只是告訴我們「它不起作用」,我們無法真正幫助你。 – 2009-12-12 11:07:34

+0

我完全沒有得到正確的curl語法在java ..中使用,輸出我得到如下語法 curl -o response.txt -w%{http_code} -k -v -X POST -d @/path/xyz.xml -H「Content-Type:application/xml」-H「Accept:application/xml」 – sarah 2009-12-12 11:09:25

0

您應該用Java代碼第4行中的其他東西代替 %{http_code} Java不會插入環境變量。

另外,請看Runtime#exec方法。這使您可以執行命令,而無需擔心引號等。

在嘗試調試來自java的調用之前,確保命令運行時沒有問題(例如服務器不接受發佈的內容)可能是一個好主意。一次處理一個問題要容易得多。

+0

我使用相同的運行時命令來執行,但輸出是壞請求 – sarah 2009-12-12 11:04:02

+0

莎拉,你需要替換'http_code',因爲它是一個環境變量!或者使用'System.getenv(「http_code」)'。 – Geo 2009-12-12 11:42:11

+0

沒關係,但是http_code的值應該是多少? – sarah 2009-12-12 11:58:42

0

如果您使用的環境變量,那麼你需要確保:

  1. 他們exported
  2. 你通過shell執行curl(如/bin/bash

出口手段變量暴露給子進程。在調用可執行文件之前,shell執行會擴展這些內容。

所以你的調用將是這樣的:

sh curl .... 

這將有助於瞭解您的調用Process.exec().一個常見的問題是,你需要消耗過程同時的標準輸出/標準錯誤,否則您的sh/curl進程可能會阻止等待您的父進程使用輸出。有關更多詳細信息,請參見here

+0

好吧,現在我沒有使用任何環境變量......,我們是否需要使用此語法執行curl sh curl ... curl本身就是一個命令,爲什麼我們需要sh? – sarah 2009-12-12 12:07:20

+0

如果你不使用環境變量,那麼你不需要/ bin/bash。 shell會擴展你在命令行中引用的任何環境變量,所以如果你沒有使用任何的話,那麼單獨執行curl就沒問題。我的評論是。然而,併發性仍然存在! – 2009-12-12 12:26:11