Can't send a correct POST request in Java (Android Studio)

旧街凉风 提交于 2019-12-12 00:36:47

问题


I'm creating an app for asking/answering questions. I have a problem with POST request when I ask questions.

I've tried to use something like this in terminal

curl -H "Content-Type: application/json" -d '{"firstName":"Chris", "lastName": "Chang", "email": "support@mlab.com"}' http://your-app-name.herokuapp.com/contacts

and it worked good.

But when I try to send a POST request in AndroidStudio my parameters (such as name, lastname, email and etc) won't send. I tried to use https://github.com/kevinsawicki/http-request. The request is send (I know that because it shows the date of the request) but without any parameters.

What should be changed in my code so it would work correctly?

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");

回答1:


I have just tried to create an User and it worked. You can refresh the link u have shared to check the created User.

This is what I have tried

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){

        }

UPDATE

BTW I have used json jar from this link




回答2:


try this hope it'll work

public JSONObject getJSONFromUrl(String url_, JSONObject jsonObject) {

    try {
        URLConnection urlConn;
        DataOutputStream printout;

        URL url = new URL(url_);
        urlConn = url.openConnection();
        urlConn.setDoInput(true);
        urlConn.setDoOutput(true);
        urlConn.setConnectTimeout(30000);
        urlConn.setReadTimeout(30000);
        urlConn.setUseCaches(false);
        urlConn.setRequestProperty("Content-Type", "application/json");
        urlConn.setRequestProperty("Accept", "application/json");

        urlConn.setRequestProperty("Authorization", "token"); // If Applicable 
        urlConn.connect();
        printout = new DataOutputStream(urlConn.getOutputStream());
        printout.writeBytes(jsonObject.toString());
        printout.flush();
        BufferedReader reader = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));

        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        printout.close();
        reader.close();
        json = sb.toString();
    } catch (SocketException e) {
        e.printStackTrace();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        jObj = new JSONObject(json);
    } catch (JSONException e) {
        e.printStackTrace();
    }
    Applog.e("response", jObj + "");
    return jObj;

}



回答3:


Try like this..

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;
        }



回答4:


Basically your curl requests sends the user data in JSON format in the request body. Your Java code tries to send the data in the request as form data which is something different and probably not accepted by the server.

You might need to change your code to use the HttpRequest.send(...) method instead of 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());

Furthermore in the curl call you are using accesses a different url than in the Java snippet http://your-app-name.herokuapp.com/contacts vs https://safe-citadel-91138.herokuapp.com/questions maybe you are talking to the wrong endpoint as well?

You might want to take a look at some Java to JSON mapping library like gson for the transformation of your Java objects to proper JSON or use Android's JSONObject class.

UPDATE:

  • Added link to gson for JSON mapping
  • Updated code snippet to use JSONObject for the JSON mapping


来源:https://stackoverflow.com/questions/37525153/cant-send-a-correct-post-request-in-java-android-studio

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!