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/