2016-10-04 200 views
0

我试图实现一个客户端,该客户端先登录并执行一些工作。 这是我的卷发要求:将curl请求转换为HttpURLConnection

curl -v https://api.example.com/api-token-auth/ \ 
    -H "Accept: application/json" \ 
    -d "username=myusername&password=mypassword" 

我想把它转换成Java代码。这是我曾尝试:

HttpURLConnection conn; 
URL obj = new URL("https://api.example.com/api-token-auth/"); 
URL obj = new URL(quoteURL); 
conn = (HttpURLConnection) obj.openConnection(); 
conn.setRequestMethod("POST"); 
conn.setDoOutput(true); 
String userpass = "username=myusername" + "&" + "password=mypassword"; 
String basicAuth = new String(Base64.getEncoder().encode(userpass.getBytes())); 
conn.setRequestProperty("Authorization", basicAuth); 
conn.setRequestProperty("Accept", "*/*"); 
conn.setRequestProperty("Accept-Encoding", "gzip, deflate"); 
conn.setRequestProperty("Accept-Language", "en;q=1, fr;q=0.9, de;q=0.8,ja;q=0.7, nl;q=0.6, it;q=0.5"); 
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=utf-8"); 
conn.setRequestProperty("API-Version", "1.3.0"); 
conn.setRequestProperty("Connection", "keep-alive"); 
conn.setRequestProperty("Accept", "*/*"); 
conn.setRequestProperty("User-Agent", "Mozilla/5.0"); 
conn.connect(); 
InputStreamReader inputStreamReader = new InputStreamReader(conn.getInputStream()); 
BufferedReader in = new BufferedReader(inputStreamReader); 
String inputLine; 
StringBuffer response = new StringBuffer(); 

while ((inputLine = in.readLine()) != null) { 
response.append(inputLine); 
} 
in.close(); 
conn.disconnect(); 
return response; 

然后我收到此错误:

Exception in thread "main" java.io.IOException: Server returned HTTP response code: 400 for URL: https://api.example.com/api-token-auth/ 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1839) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1440) 
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254) 

我尝试了好几种可能的解决方案,但没有运气。我可以发现我做错了什么。

回答

1

您的卷曲请求没有实际做HTTP基本验证(这是你的例子代码试图做的) - 它只是张贴-d参数传递给服务器(作为一个URL编码体)

所以

  1. 摆脱所有调用setRequestProperty的()的东西(它不需要)
  2. 使用con.setContentType( “应用程序/ x-WWW的形式,进行了urlencoded”),其可以说是有点清洁]
  3. 写用户传递给con.getOutp的字符串utStream()无需使用Base64编码......再次,这有什么好做的W/HTTP BASICAUTH]

例如,您curl命令发出以下HTTP请求

POST /api-token-auth/ HTTP/1.1 
Host: api.example.com 
User-Agent: curl/7.49.1 
Accept: application/json 
Content-Length: 39 
Content-Type: application/x-www-form-urlencoded 

username=myusername&password=mypassword 

以下Java程序将执行几乎完全一样的要求

public class SO { 
public static void main(String[] args) throws Exception { 
    String rsp = curl("http://axrsgpar0019:13080/api-token-auth/", "application/json", "username=myusername&password=mypassword"); 
} 
public static String curl(String url, String accepts, String minusD) throws Exception { 
    HttpURLConnection con = (HttpURLConnection)new URL(url).openConnection(); 
    con.setDoOutput(true); 
    con.setRequestProperty("Accept", accepts); 
    con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
    con.getOutputStream().write(minusD.getBytes()); 
    con.getOutputStream().close(); 

    ByteArrayOutputStream rspBuff = new ByteArrayOutputStream(); 
    InputStream rspStream = con.getInputStream(); 

    int c; 
    while ((c = rspStream.read()) > 0) { 
     rspBuff.write(c); 
    } 
    rspStream.close(); 

    return new String(rspBuff.toByteArray()); 
} 
} 

生成以下HTTP请求(唯一的区别是用户代理和保alive..which应该是微不足道的)

POST /api-token-auth/ HTTP/1.1 
Accept: application/json 
Content-Type: application/x-www-form-urlencoded 
User-Agent: Java/1.8.0_91 
Host: api.example.com 
Connection: keep-alive 
Content-Length: 39 

username=myusername&password=mypassword 
+0

oh..whoops - 如果Accept:application/json很重要,那么您必须设置该报头 –

+0

感谢您的回应,不幸的是,这并没有设置RequestReperty(“Accept”,“app/json”)工作。当我提交上面的curl请求时,我收到了一个json格式的响应,如{“token”:“234234234234234234234234234234234234234324”}。这应该很简单,但它不起作用。这部分{-d“username = myusername&password = mypassword”}具有“&”和“=”符号。这是否有关于此?我也试过“:”而不是“&”和“:”。 – celik

+0

我更新了我的回应w /一个完整的例子 - 你的curl命令的-d参数是正确的www-form-urlencoded(同样,curl本身只是传递-d参数作为HTTP请求的主体) –

相关问题