2017-04-25 47 views
1

这是Python代码如何urllib.request里代码转换Python的Java代码

import urllib.request as urllib2 
import json 

data = { 
    "Inputs": { 
     "input1": { 
      "ColumnNames": ["id", "regex"], 
      "Values": [ [ "0", "the regex value" ],] 
     }, 
    }, 
    "GlobalParameters": { 
     "Database query": "select * from expone", 
    } 
} 

body = str.encode(json.dumps(data)) 

url = 'https://ussouthcentral.services.azureml.net/workspaces/4729545551a741e1a2e606d37' \ 
     'ae61ce0/services/ac7c34ad134d43ca9fdc65e292ce35d3/execute?api-version=2.0&details=true' 
api_key = '8ku5P6fR3F8ykgMHK5Y8+PL8dn+Zi2Ajmwyjk9ENsomzzkDfuT8CtgKS7dF4yjaJfYxARe+1iLjh' \ 
      'Tv1R0qOTvw==' 
headers = { 
    'Content-Type': 'application/json', 
    'Authorization': ('Bearer '+ api_key) 
} 

req = urllib2.Request(url, body, headers) 

try: 
    response = urllib2.urlopen(req) 
    result = response.read() 
    print(result) 
except Exception as e: 
    print("The request failed with status code: ", e) 

这是我在Java中

尝试
public static void main(String[] args) { 
    System.out.println("MachineLearning main"); 
    try{       
     //connections settings 
     URL url = new URL("https://ussouthcentral.services.azureml.net/workspaces/4729545551a741e1a2e606d37ae61ce0/services/ac7c34ad134d43ca9fdc65e292ce35d3/execute?api-version=2.0&details=true"); 
     HttpURLConnection con = (HttpURLConnection)url.openConnection(); 
     con.setDoInput(true); 
     con.setDoOutput(true);    
     String requestMethod = "GET";    
     con.setRequestMethod(requestMethod); 
     con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 

     String data=URLEncoder.encode("input1", "UTF-8") + "=" 
      + URLEncoder.encode("\"ColumnNames\": [\"id\", \"regex\"]", "UTF-8") + "&" 
      + URLEncoder.encode("GlobalParameters", "UTF-8") 
      + URLEncoder.encode("Database query\": \"select * from expone\"", "UTF-8"); 

     //make the request 
     OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream());     
     writer.write(data);     
     writer.flush(); 

     //read the request 
     BufferedReader reader=new BufferedReader(new InputStreamReader(con.getInputStream())); 
     String response; 
     while ((response=reader.readLine())!=null) 
      System.out.println(response);   
    } 
    catch(Exception e) { 
     System.out.println("Exception in MachineLearning.main " + e); 
    } 
} 

中请求的Java代码不是成功并返回一个例外: 服务器返回的HTTP响应代码:401为URL

问题是我不知道如何将python中的数据变量转换为java,以及如何传递apiKey,以及如何将它放在标题中?

回答

2

您的Java代码中的几个小 '错误':

  1. 更改setRequestMethod为 “POST”
  2. 更改 “内容类型” 为 “application/JSON”
  3. 添加新setRequestProperty授权
  4. 不要进行urlencode的data

代码:

public static void main(String[] args) { 
    System.out.println("MachineLearning main"); 
    try{       
     //connections settings 
     String api_key = "8ku5P6fR3F8ykgMHK5Y8+PL8dn+Zi2Ajmwyjk9ENsomzzkDfuT8CtgKS7dF4yjaJfYxARe+1iLjhTv1R0qOTvw=="; 
     String data = "{\"Inputs\": {\"input1\": {\"ColumnNames\": [\"id\", \"regex\"], \"Values\": [[\"0\", \"the regex value\"]]}}, \"GlobalParameters\": {\"Database query\": \"select * from expone\"}}"; 
     URL url = new URL("https://ussouthcentral.services.azureml.net/workspaces/4729545551a741e1a2e606d37ae61ce0/services/ac7c34ad134d43ca9fdc65e292ce35d3/execute?api-version=2.0&details=true"); 
     HttpURLConnection con = (HttpURLConnection) url.openConnection(); 

     con.setDoInput(true); 
     con.setDoOutput (true);    
     con.setRequestMethod("POST"); 
     con.setRequestProperty("Content-Type", "application/json"); 
     con.setRequestProperty("Authorization", "Bearer " + api_key); 

     //make the request 
     OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream());     
     writer.write(data);     
     writer.flush(); 

     //read the request 
     BufferedReader reader=new BufferedReader(new InputStreamReader(con.getInputStream())); 
     String response; 
     while ((response=reader.readLine())!=null) 
      System.out.println(response); 
    } catch(Exception e) { 
     System.out.println("Exception in MachineLearning.main " + e); 
    } 
}