如何使用Java将curl命令转换为HTTP POST请求

时间:2019-08-23 12:48:12

标签: java curl

我想在HTTP中用POST java请求运行此特定curl命令

curl --location --request POST "http://106.51.58.118:5000/compare_faces?face_det=1" \
  --header "user_id: myid" \
  --header "user_key: thekey" \
  --form "img_1=https://cdn.dnaindia.com/sites/default/files/styles/full/public/2018/03/08/658858-577200-katrina-kaif-052217.jpg" \
  --form "img_2=https://cdn.somethinghaute.com/wp-content/uploads/2018/07/katrina-kaif.jpg"

我只知道如何通过传递POST对象来发出简单的JSON请求,但是我从未尝试根据上述POST命令来curl。 / p>

这是我根据此POST命令制作的一个curl示例:

curl -X POST TheUrl/sendEmail 
-H 'Accept: application/json' -H 'Content-Type: application/json' 
-d '{"emailFrom": "smth@domain.com", "emailTo": 
["smth@gmail.com"], "emailSubject": "Test email", "emailBody":
"708568", "generateQRcode": true}' -k 

这是我使用java

的方法
    public void sendEmail(String url) {
        try {
            URL obj = new URL(url);
            HttpURLConnection con = (HttpURLConnection) obj.openConnection();

            //add reuqest header
            con.setRequestMethod("POST");
            con.setRequestProperty("Content-Type", "application/json; utf-8");
            con.setRequestProperty("Accept", "application/json");
            con.setDoOutput(true);

            // Send post request
            JSONObject test = new JSONObject();
            test.put("emailFrom", emailFrom);
            test.put("emailTo", emailTo);
            test.put("emailSubject", emailSubject);
            test.put("emailBody", emailBody);
            test.put("generateQRcode", generateQRcode);
            String jsonInputString = test.toString();
            System.out.println(jsonInputString);
            System.out.println("Email Response:" + returnResponse(con, jsonInputString));
        } catch (Exception e) {
            System.out.println(e);
        }
        System.out.println("Mail sent");
    }

    public String returnResponse(HttpURLConnection con, String jsonInputString) {
        try (OutputStream os = con.getOutputStream()) {
            byte[] input = jsonInputString.getBytes("utf-8");
            os.write(input, 0, input.length);
        } catch (Exception e) {
            System.out.println(e);
        }
        try (BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "utf-8"))) {
            StringBuilder response = new StringBuilder();
            String responseLine = null;
            while ((responseLine = br.readLine()) != null) {
                response.append(responseLine.trim());
            }
            return response.toString();
        } catch (Exception e) {
            System.out.println("Couldnt read response from URL");
            System.out.println(e);
            return null;
        }
    }

我发现这个有用的link,但是在我的示例中我真的不明白如何使用它。

与我的示例有什么不同吗?如果可以,我如何POST以下数据?

注意:必需数据


HEADERS:

user_id myid
user_key mykey

PARAMS:
face_det 1
boxes 120,150,200,250 (this is optional)


BODY:

img_1
multipart/base64 encoded image or remote url of image

img_2
multipart/base64 encoded image or remote url of image

这是API

的完整文档

1 个答案:

答案 0 :(得分:1)

您的HttpURLConnection需要完成四件事:

  • 请求方法。您可以使用setRequestMethod进行设置。
  • 标题。您可以使用setRequestProperty进行设置。
  • 内容类型。 The HTML specification requires包含表单提交的HTTP请求的正文内容类型为p = Pizza.objects.all().filter(base="Regular", size="small", intToppings=0) print(p.price) (或application/x-www-form-urlencoded)。就像其他标头一样,这是通过使用multipart/form-data方法设置Content-Type标头来完成的。
  • 根据内容类型的指示,正文本身需要进行URL编码。 URLEncoder class为此目的而存在。

这四个步骤如下:

setRequestProperty

您应该从代码中删除所有String img1 = "https://cdn.dnaindia.com/sites/default/files/styles/full/public/2018/03/08/658858-577200-katrina-kaif-052217.jpg"; String img2 = "https://cdn.somethinghaute.com/wp-content/uploads/2018/07/katrina-kaif.jpg"; con.setRequestMethod("POST"); con.setDoOutput(true); con.setRequestProperty("user_id", myid); con.setRequestProperty("user_key", thekey); con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); String body = "img_1=" + URLEncoder.encode(img1, "UTF-8") + "&" + "img_2=" + URLEncoder.encode(img2, "UTF-8"); try (OutputStream os = con.getOutputStream()) { byte[] input = body.getBytes(StandardCharsets.UTF_8); os.write(input); } 块,并修改方法签名以包含catch。您不希望应用程序的用户认为操作实际上是成功的,对吧?