无法在Java中发送正确的POST请求(Android Studio)

时间:2016-05-30 11:59:44

标签: java android android-studio http-post

我正在创建一个用于提问/回答问题的应用。 我提问时,我的POST请求有问题。

我试图在终端

中使用这样的东西
curl -H "Content-Type: application/json" -d '{"firstName":"Chris", "lastName": "Chang", "email": "support@mlab.com"}' http://your-app-name.herokuapp.com/contacts

它运作良好。

但是当我尝试在AndroidStudio中发送POST请求时,我的参数(例如姓名,姓氏,电子邮件等)将不会发送。 我尝试使用https://laracasts.com/discuss/channels/tips/50-loading-form-macros。请求发送(我知道因为它显示了请求的日期)但没有任何参数。

我的代码应该更改哪些内容才能正常工作?

Map<String, String> data = new HashMap<String, String>();
data.put("firstName", "Gena");
data.put("lastName", "Bukin");
if (HttpRequest.post("https://safe-citadel-91138.herokuapp.com/questions").form(data).created())
System.out.println("User was created");

4 个答案:

答案 0 :(得分:0)

基本上,您的curl请求会在请求正文中以JSON格式发送用户数据。您的Java代码尝试将请求中的数据作为表单数据发送,这些数据是不同的,可能不被服务器接受。

您可能需要更改代码才能使用HttpRequest.send(...)方法而不是form

JSONObject json = new JSONObject();
json.put("firstName", "Gena");
json.put("lastName", "Bukin");
json.put("email", "support@mlab.com");

HttpRequest
    .post("https://safe-citadel-91138.herokuapp.com/questions")
    .contentType("application/json")
    .send(json.toString());

此外,在curl调用中您使用的访问权限与Java代码段http://your-app-name.herokuapp.com/contacts vs https://safe-citadel-91138.herokuapp.com/questions中的访问权限不同,也许您正在与错误的端点进行通信?

您可能希望查看一些Java到JSON映射库,如gson,以便将Java对象转换为正确的JSON或使用Android的JSONObject类。

更新

  • 添加了用于JSON映射的gson链接
  • 更新了代码段,以便将JSONObject用于JSON映射

答案 1 :(得分:0)

试试这个希望它会起作用

setlocal enableDelayedExpansion
for /r "C:\copies" %%# in (*.bak) do (
  (forfiles /p "%%~dp#"  /m "%%~nx#" /d 0 )&&(
      echo ok
      color
  )||(
     echo not ok
     exit !errorlevel!
  )
)

答案 2 :(得分:0)

试试这样..

Map<String, Object> params = new LinkedHashMap<>();
params.put("firstName", "Gena");
params.put("lastName", "Bukin");


JSONObject jsonObject = POST("https://safe-citadel-91138.herokuapp.com/questions", params);
    /**
         * Method allows to HTTP POST request to the server to send data to a specified resource
         * @param serverURL URL of the API to be requested
         * @param params parameter that are to be send in the "body" of the request Ex: parameter=value&amp;also=another
         * returns response as a JSON object
         */
        public JSONObject POST(String serverURL, Map<String, Object> params) {
            JSONObject jsonObject = null;
            try {
                URL url = new URL(serverURL);

                Log.e(TAG, params.toString());
                StringBuilder postData = new StringBuilder();

                for (Map.Entry<String, Object> param : params.entrySet()) {
                    if (postData.length() != 0) postData.append('&');
                    postData.append(URLEncoder.encode(param.getKey(), "UTF-8"));
                    postData.append('=');
                    postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));
                }
                Log.e("POST", serverURL + ":" + params.toString());
                byte[] postDataBytes = postData.toString().getBytes("UTF-8");
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setRequestProperty("Content-Type", "application/json");
                connection.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length));
                connection.setRequestMethod("POST");
                connection.setConnectTimeout(5000);
                connection.setUseCaches(false);
                connection.setDoOutput(true);
                connection.getOutputStream().write(postDataBytes);
                connection.connect();

                int statusCode = connection.getResponseCode();
                if (statusCode == 200) {
                    sb = new StringBuilder();
                    reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                    String line;
                    while ((line = reader.readLine()) != null) {
                        sb.append(line + "\n");
                    }
                }
                jsonObject = new JSONObject(sb.toString());
            } catch (Exception e) {
                //e.printStackTrace();
            }
            return jsonObject;
        }

答案 3 :(得分:0)

我刚刚尝试创建一个用户,但它确实有效。您可以刷新已共享的link以检查创建的用户。

这就是我试过的

String endPoint= "https://safe-citadel-91138.herokuapp.com/questions";
        try {

            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost post = new HttpPost(endPoint);
            post.addHeader("Content-Type", "application/json");
            JSONObject obj = new JSONObject();

            obj.put("firstName", "TESTF");
            obj.put("lastName", "TESTL");
            obj.put("email", "support@mlab.com");

            StringEntity entity = new StringEntity(obj.toString()); 
            post.setEntity(entity);
            HttpResponse response = httpClient.execute(post);
}catch (Exception e){

        }

<强>更新

BTW我使用了来自this链接

的json jar