简体   繁体   English

将curl请求转换为HttpURLConnection

[英]convert curl request into HttpURLConnection

I am trying to implement a client that logins first and do some staff. 我正在尝试实现一个首先登录并需要一些人员的客户端。 This is my curl request: 这是我的卷曲要求:

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

I want to convert it into java code. 我想将其转换为Java代码。 Here is what I have tried: 这是我尝试过的:

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;

Then I receive this error: 然后我收到此错误:

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)

I have tried several possible solutions, but no luck. 我尝试了几种可能的解决方案,但是没有运气。 I could nit find what I am doing wrong. 我可以发现我在做什么错。

your curl request isn't actually doing HTTP basicAuth (which is what your example code is trying to do) - it's just POSTing the -d argument to the server (as a url encoded body) 您的curl请求实际上并没有执行HTTP basicAuth(这是您的示例代码要尝试的操作)-只是将-d参数发布到服务器(作为url编码的主体)

so 所以

  1. get rid of all the setRequestProperty() stuff (it's not needed) 摆脱所有setRequestProperty()的东西(不需要)
  2. use con.setContentType("application/x-www-form-urlencoded") [which is arguably a bit cleaner] 使用con.setContentType(“ application / x-www-form-urlencoded”)[可以说是比较干净的]
  3. write the userpass string to con.getOutputStream() [no need to base64 encode...again, this has nothing to do w/ http basicAuth] 将userpass字符串写入con.getOutputStream()[无需再次进行base64编码...这与http basicAuth无关]

for example, your curl command issues the following HTTP request 例如,您的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

the following Java program would execute pretty much the EXACT same request 以下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());
}
}

generates the following HTTP request (only difference is User-Agent and keep-alive..which should be insignificant) 生成以下HTTP请求(唯一的区别是User-Agent和keep-alive ..这应该无关紧要)

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM