如何在 Android Studio 中使用 HTTP POST

How to HTTP POST in Android Studio

我正在尝试在 Android studio 中使用 with 检索值来执行 HTTP POST。我已经在 POSTMAN 中测试过这个东西,但我不确定如何在 Android studio 中输入它。请协助我为此创建 HTTP POST 代码。

我正在POST到

ml2.internalpositioning.com/track

有了这个身材

{"username":"fyp","location":"location","group":"cowardlycrab","time":1501640084739,"wifi-fingerprint":[{"mac":"04:c5:a4:66:43:7k","rssi":-29}]}
 //call asynctask  like below : 

JSONObject post_dict = new JSONObject();
                    try {
                        post_dict.put("username", "your_username_data");
 post_dict.put("location", "your_location_data");
 post_dict.put("group", "your_group_data");
 post_dict.put("time", "your_time_data");

JSONArray jarr = new JSONArray();
JSONObject jonj = new JSONObject();
jonj.put("mac","your_mac_data");
jonj.put("rssi","your_rssi_data");
jarr.put(jonj);
post_dict.put("wifi-fingerprint", jarr);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    new YourAsyncTask().execute(String.valueOf(post_dict));



//Actual Async Task Class 

      public class YourAsyncTask extends AsyncTask<String, String, String> {
            ProgressDialog progressDialog;

            protected void onPreExecute() {
                progressDialog = ProgressDialog.show(MainActivity.this,
                        "Please Wait...",
                        "Registering Device");
                super.onPreExecute();
            }

            protected String doInBackground(String... params) {
                String JsonResponse = null;
                String JsonDATA = params[0];
                HttpURLConnection urlConnection = null;
                BufferedReader reader = null;
                try {
                    URL url = new URL("ml2.internalpositioning.com/track");
                    urlConnection = (HttpURLConnection) url.openConnection();
                    urlConnection.setDoOutput(true);
                    // is output buffer writter
                    urlConnection.setRequestMethod("POST");
                    urlConnection.setRequestProperty("Content-Type", "application/json");
                    urlConnection.setRequestProperty("Accept", "application/json");
                    //set headers and method
                    Writer writer = new BufferedWriter(new OutputStreamWriter(urlConnection.getOutputStream(), "UTF-8"));
                    writer.write(JsonDATA);
                    // json data
                    writer.close();
                    InputStream inputStream = urlConnection.getInputStream();
                    //input stream
                    StringBuffer buffer = new StringBuffer();
                    if (inputStream == null) {
                        // Nothing to do.
                        return null;
                    }
                    reader = new BufferedReader(new InputStreamReader(inputStream));

                    String inputLine;
                    while ((inputLine = reader.readLine()) != null)
                        buffer.append(inputLine + "\n");
                    if (buffer.length() == 0) {
                        // Stream was empty. No point in parsing.
                        return null;
                    }
                    JsonResponse = buffer.toString();
                    //response data
                    try {
                    //send to post execute
                        return JsonResponse;
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    return null;

                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (urlConnection != null) {
                        urlConnection.disconnect();
                    }
                    if (reader != null) {
                        try {
                            reader.close();
                        } catch (final IOException e) {
                        }
                    }
                }
                return null;
            }

            @Override
            protected void onPostExecute(String result) {
                if (progressDialog != null)
                    progressDialog.dismiss();
                super.onPostExecute(result);
               //Do something with result
            }
        }

我也尝试发送一个 http post。 我从上面拿代码 并根据我的情况进行更改。 但不幸的是出了点问题。

我想将 Date 发送到我的 Yamaha AV 接收器 RX-A1080。 有一个 Web 界面,我用它记录了 HTTP POST 命令 在火狐浏览器中。 Firefox 浏览器还以紧凑的 CURL 命令语法提供数据,因此 您可以在以下行中更好地查看 HTTP POST 命令的数据:

(as a CURL Command)
curl 
'http://192.168.0.24/YamahaRemoteControl/ctrl' 
-H 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0' 
-H 'Accept: */*' 
-H 'Accept-Language: de,en-US;q=0.7,en;q=0.3' 
--compressed 
-H 'Referer: http://192.168.0.24/Setup/' 
-H 'Content-Type: text/xml' 
-H 'Connection: keep-alive' 
--data '<?xml version="1.0" encoding="utf-8"?><YAMAHA_AV cmd="PUT"><System><Speaker_Preout><Pattern_1><PEQ><Manual_Data><Front_L><Band_7><Q>0.500</Q></Band_7></Front_L></Manual_Data></PEQ></Pattern_1></Speaker_Preout></System></YAMAHA_AV>'

我将其转换为:https://curl.trillworks.com/#json 得到这个:

{
"url":"http://192.168.0.24/YamahaRemoteControl/ctrl",
"raw_url":"http://192.168.0.24/YamahaRemoteControl/ctrl",
"method":"post",
"headers":
{
   "User-Agent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) 
    Gecko/20100101 Firefox/62.0",
   "Accept":"*/*",
   "Accept-Language":"de,en-US;q=0.7,en;q=0.3",
   "Referer":"http://192.168.0.24/Setup/",
   "Content-Type":"text/xml",
   "Connection":"keep-alive"
},
"data":
{
   "<?xml version":"\"1.0\" encoding=\"utf-8\"?><YAMAHA_AV cmd=\"PUT\"> 
<System><Speaker_Preout><Pattern_1><PEQ><Manual_Data><Front_L><Band_7><Q>0.500</Q></Band_7></Front_L></Manual_Data></PEQ></Pattern_1></Speaker_Preout></System></YAMAHA_AV>"
}
}

我写的代码是: (我不确定 JSONObject 数据中是否有很多斜杠???)

    // Gesamt JSON Object
    JSONObject post_dict = new JSONObject();

    try {
        post_dict.put("url", "http://192.168.0.24/YamahaRemoteControl/ctrl");
        post_dict.put("raw_url", "http://192.168.0.24/YamahaRemoteControl/ctrl");
        post_dict.put("method", "post");

        // headers - JSON Object ////////////////////////////////////////////

        JSONObject headers = new JSONObject();
        headers.put("User-Agent","Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0");
        headers.put("Accept","*/*");
        headers.put("Accept-Language","de,en-US;q=0.7,en;q=0.3");
        headers.put("Referer","http://192.168.0.24/Setup/");
        headers.put("Content-Type","text/xml");
        headers.put("Connection","keep-alive");

        post_dict.put("headers", headers);

        // data - JSON Object ////////////////////////////////////////////

        JSONObject data = new JSONObject();
        data.put("<?xml version","\\"1.0\\" encoding=\\"utf-8\\"?><YAMAHA_AV cmd=\\"PUT\\"><System><Speaker_Preout><Pattern_1><PEQ><Manual_Data><Front_L><Band_7><Gain><Val>-200</Val><Exp>1</Exp><Unit>dB</Unit></Gain></Band_7></Front_L></Manual_Data></PEQ></Pattern_1></Speaker_Preout></System></YAMAHA_AV>");

        post_dict.put("data", data);

    } catch (JSONException e) {
        e.printStackTrace();
    }
    new YourAsyncTask().execute(String.valueOf(post_dict));

有人能告诉我有什么问题吗:-(

有关Firefox完成的记录命令的更多信息 你可以看到以下几行。 (但它们类似于 CURL 命令)

New Request
============
POST http://192.168.0.24/YamahaRemoteControl/ctrl

Request-Header:
===============
Host: 192.168.0.24
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0
Accept: */*  
        Accept-Language: de,en-US;q=0.7,en;q=0.3
        Accept-Encoding: gzip, deflate
        Referer: http://192.168.0.24/Setup/
        Content-Type: text/xml
        Content-Length: 272
        Connection: keep-alive

Request-Body:
=============
<?xml version="1.0" encoding="utf-8"?>
<YAMAHA_AV cmd="PUT">
    <System>
        <Speaker_Preout>
            <Pattern_1>
                <PEQ>
                    <Manual_Data>
                        <Front_L>
                            <Band_7>

                                <Gain>
                                    <Val>-10</Val>
                                    <Exp>1</Exp>
                                    <Unit>dB</Unit>
                                </Gain>
                         or
                                <Freq>1.26 kHz</Freq>
                         or
                                <Q>0.500</Q>

                            </Band_7>
                        </Front_L>
                    </Manual_Data>
                </PEQ>
            </Pattern_1>
        </Speaker_Preout>
    </System>
</YAMAHA_AV>

我的错误是我的数据不是 json 对象。 我只需将 "data" 作为字符串发送。 然后就可以了 ;-)