4

djangoのrestfullapiへの接続をテストするためにJavaでテストポーグラムを書いています(正確にはdjangorestframework)。オプションの1つは、curlを使用してAPIをテストすることです。シェルからcurlコマンドを実行すると、正常に機能します。例:

curl --show-error --request GET --header 'Accept: application/json' --user "user:pwd" http://127.0.0.1:8000/api/v1/

これにより、APIルートのURLとヘルプテキストがjson形式で適切に返されます。

ProcessBuilderを使用してJavaから同じものを呼び出そうとすると、次の答えが得られます。

{"detail": "You do not have permission to access this resource. You may need to login or otherwise authenticate the request."}

私が使用しているJavaコードは次のとおりです。

ProcessBuilder p=new ProcessBuilder("curl","--show-error", "--request","GET",
                    "--header","'Accept: application/json'", "--user","\"" + userName + ":" + password + "\"", getApiRootUrlString());
final Process shell = p.start();

エラーストリームも次のようにキャッチするためです。

InputStream errorStream= shell.getErrorStream();
InputStream shellIn = shell.getInputStream();

オプションの1つを間違えると、curlヘルプテキストが表示されるため、彼がcurlコマンドを開始したことはわかっています。

私はそれを呼び出すことの違いが何であるかわからない、それが同じコマンドであることをかなり確信している。

ちなみに、'getApiRootUrlString()'は正しいURLを返します。http://127.0.0.1:8000/api/v1/

4

1 に答える 1

5

コンストラクターに渡す各文字列ProcessBuilderは1つの引数を表すため、シェルで使用する必要のある引用符は必要ありません。次のことを試してください。

ProcessBuilder p=new ProcessBuilder("curl","--show-error", "--request","GET",
                "--header","Accept: application/json", "--user", userName + ":" + password, getApiRootUrlString());

引用符を使用すると、プロセスに渡される値の一部になるため、ユーザー名"userとパスワードを使用して認証を試みていましたpwd"

于 2012-07-11T22:38:37.720 に答える