前提・実現したいこと
ブラウザで利用できる簡易オンラインコンパイラを作りたい。
AceEditorでコードを受け取りJdoodleAPIにコードを送信し出力結果を得るという流れを実現させようとしています。
・JdoodleAPI Document
https://docs.jdoodle.com/compiler-api/compiler-api
発生している問題・エラーメッセージ
- Ajaxで入力コードをJavaにPOST
- JavaからJdoodle APIにPOST
→Javaにて下記エラー(Ajaxはエラーなし)
java.lang.RuntimeException: Please check your inputs : HTTP error code : 403
該当のソースコード
JavaScript
1 2function sampleAjax(script) { 3 //リクエストJSON 4 var request = { 5 script : script, 6 }; 7 console.log("Script : " + script); 8 //ajaxでservletにリクエストを送信 9 $.ajax({ 10 type : "POST", 11 url : "JavaServletURL", 12 data : request, 13 async : true, 14 success : function(data) { 15 var rs = document.getElementById("result-area"); 16 console.log("Success"); 17 rs.innerText = data; 18 }, 19 error : function(XMLHttpRequest, textStatus, errorThrown) { 20 alert("リクエスト時になんらかのエラーが発生しました:" + textStatus +":\n" + errorThrown); 21 } 22 }); 23} 24
JavaServlet
1 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 2 3 try { 4 5 String script = request.getParameter("script"); 6 7 CompileLogic bo = new CompileLogic(); 8 String result = bo.execute(script_f); 9 10 PrintWriter pw = response.getWriter(); 11 12 pw.print(result); 13 14 pw.close(); 15 16 } catch(Exception e) { 17 e.printStackTrace(); 18 } 19 20 } 21 22}
Java
1package model; 2 3import java.io.BufferedReader; 4import java.io.IOException; 5import java.io.InputStreamReader; 6import java.io.OutputStream; 7import java.net.HttpURLConnection; 8import java.net.MalformedURLException; 9import java.net.URL; 10import java.util.ResourceBundle; 11 12import org.json.JSONObject; 13 14public class CompileLogic { 15 16 public String execute(String targetScript) { 17 String clientId = ***; 18 String clientSecret = ***; 19 20 String script = targetScript; 21 String language = "java"; 22 String versionIndex = "0"; 23 24 try { 25 URL url = new URL("https://api.jdoodle.com/v1/execute"); 26 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 27 connection.setDoOutput(true); 28 connection.setRequestMethod("POST"); 29 connection.setRequestProperty("Content-Type", "application/json"); 30 31 String input = "{\"clientId\": \"" + clientId + "\",\"clientSecret\":\"" + clientSecret + "\",\"script\":\"" + script + 32 "\",\"language\":\"" + language + "\",\"versionIndex\":\"" + versionIndex + "\"} "; 33 34 OutputStream outputStream = connection.getOutputStream(); 35 outputStream.write(input.getBytes()); 36 outputStream.flush(); 37 38 if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) { 39 throw new RuntimeException(input + "Please check your inputs : HTTP error code : "+ connection.getResponseCode()); 40 } 41 42 BufferedReader bufferedReader; 43 bufferedReader = new BufferedReader(new InputStreamReader( 44 (connection.getInputStream()))); 45 46 String output; 47 48 while ((output = bufferedReader.readLine()) != null) { 49 JSONObject json = new JSONObject(output); 50 String resultScript = json.getString("output"); 51 return resultScript; 52 } 53 54 connection.disconnect(); 55 56 } catch (MalformedURLException e) { 57 e.printStackTrace(); 58 } catch (IOException e) { 59 e.printStackTrace(); 60 } 61 return null; 62 } 63 64} 65
試したこと
- ローカル環境で実行
問題なくコンパイルでき出力を得ることができました。
- 403 Errorを調べたところサーバー側で認証はできたが権限がないとのことですがローカルで実行できてます。したがって本番環境またはJdoodleサーバー側で問題が発生してるのかなと考えています...。
補足情報(FW/ツールのバージョンなど)
[本番環境]
さくらVPS
CentOS7
Openjdk 1.8.0_292
Tomcat 9.0.45
Apache 2.4.6
[ローカル環境]
Windows10
Openjdk 12.0.1
Tomcat 9.0.34
Eclipse 2020-03 (4.15.0)
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。