java - Parse.com REST API 错误代码 400 : Bad Request from Java HTTP Request to Cloud Function

标签 java rest parse-platform json

我有一个字符串正在尝试发送到 Parse.com 云函数。根据REST API文档( https://www.parse.com/docs/rest#general-requests ),它必须是json格式,所以我将其做成json对象并将其转换为字符串附加到http请求url的末尾。

    JSONObject jsonParam = new JSONObject();
    jsonParam.put("emailId", emailId);
    String urlParameters = jsonParam.toString();

然后我按如下方式发送请求,尝试将其 cURL 代码示例匹配为 Java 代码:

        con.setDoOutput(true);
        DataOutputStream wr = null;
        wr = new DataOutputStream(con.getOutputStream());
        wr.writeBytes(urlParameters);
        wr.flush();
        wr.close();

尽管如此,我还是收到了返回的错误代码 400 以及错误消息“Bad Request”,我认为这是由于发送到云函数的参数无法识别造成的。我的代码中没有触发任何其他错误。然而,我通过控制台日志验证了 emailId 是一个普通字符串,并且生成的 JSON 对象以及它的 .toString() 等效项作为正确的字符串读取JSON 对象。这也适用于我在 Parse 数据库中创建对象的另一个函数。那么为什么它在这里不起作用呢?

以下是供引用和上下文的完整函数:

private void sendEmailWithParse(String emailId) throws IOException {
    String url = "https://api.parse.com/1/functions/sendEmailNow";
    URL obj = new URL(url);
    HttpsURLConnection con = null;
    try {
        con = (HttpsURLConnection) obj.openConnection();
    } catch (IOException e) {
        System.out.println("Failed to connect to http link");
        e.printStackTrace();
    }

    //add request header
    try {
        con.setRequestMethod("POST");
    } catch (ProtocolException e) {
        System.out.println("Failed to set to POST");
        e.printStackTrace();
    }
    con.setRequestProperty("X-Parse-Application-Id", "**************************************");
    con.setRequestProperty("X-Parse-REST-API-Key", "************************************************");
    con.setRequestProperty("Content-Type", "application/json");

    JSONObject jsonParam = new JSONObject();
    jsonParam.put("emailId", emailId);
    System.out.println("parameter being sent to cloud function: " + jsonParam);
    System.out.println("parameter being sent to cloud function as string: " + jsonParam.toString());
    String urlParameters = jsonParam.toString();

    // Send post request
    con.setDoOutput(true);
    DataOutputStream wr = null;
    try {
        wr = new DataOutputStream(con.getOutputStream());
    } catch (IOException e1) {
        System.out.println("Failed to get output stream");
        e1.printStackTrace();
    }
    try {
        wr.writeBytes(urlParameters);
    } catch (IOException e) {
        System.out.println("Failed to connect to send over Parse object as parameter");
        e.printStackTrace();
    }
    try {
        wr.flush();
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        wr.close();
    } catch (IOException e) {
        System.out.println("Failed to connect to close datastream connection");
        e.printStackTrace();
    }

    int responseCode = 0;
    try {
        responseCode = con.getResponseCode();
    } catch (IOException e) {
        System.out.println("Failed to connect to get response code");
        e.printStackTrace();
    }
    System.out.println("\nSending 'POST' request to URL : " + url);
    System.out.println("Post parameters : " + urlParameters);
    System.out.println("Response Code : " + responseCode);
    System.out.println("Response message: " + con.getResponseMessage());
}

最佳答案

我通过使用HttpRequest external library解决了这个问题。它使我能够更好地控制请求并更轻松地调试问题。服务器正常接收请求,问题出在 JSON 编码上。我没有将 JSON 对象作为请求中的参数,而是将其插入到 http 请求的正文中并使用 UTF-8 对其进行编码。

最后,这是有效的代码:

    String url = "https://api.parse.com/1/functions/sendEmailNow";
    URL obj = new URL(url);

    //Attempt to use HttpRequest to send post request to parse cloud
    HttpRequest request = HttpRequest.post(obj).contentType("application/json");
    request.header("X-Parse-Application-Id", "**************************");
    request.header("X-Parse-REST-API-Key", "********************");
    JSONObject jsonParam = new JSONObject();
    jsonParam.put("emailId", emailId);
    request.send(jsonParam.toString().getBytes("UTF8"));

    if (request.ok())
        System.out.println("HttpRequest WORKED");
    else
        System.out.println("HttpRequest FAILED " + request.code() + request.body());

关于java - Parse.com REST API 错误代码 400 : Bad Request from Java HTTP Request to Cloud Function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25317064/

相关文章:

java - 公共(public)数学 : Multiple Samples support for DescriptiveStatistics instances

java ;制作线程之间的区别

java - 如何在没有 .Method() 的情况下调用功能接口(interface)中的方法

ios - 完成处理程序?异步调度?

ios - 当我尝试向 PFRelation 添加新对象时应用挂起

java - 如何检查数组中的所有值是否都高于特定数量?

android - 谷歌云语音 API : Real Time recognition via REST

wordpress - WooCommerce Rest API 按 slug 获取产品

Spring boot 应用程序不会熬夜

ios - iOS Parse PFQueryTableViewController分页问题