簡體   English   中英

OkHttp:無法通過POST方法將數據發送到服務器

[英]OkHttp: Can't send data to server via POST method

這是我對Stackoverflow的第一個問題。

將簡單的文本數據發送到服務器時,我遇到了OkHttp問題。 基本上,我正在嘗試將一段文本發送到PHP腳本tokenSave.php ,然后它將接收到的數據存儲在文本文件Token_log.txt

現在,這個問題使我兩天以來發瘋了,我所做的所有研究似乎都還沒有完成,實際上我也讀過關於SO的類似問題,但是對於我來說似乎無濟於事。

這是RegisterActivity.java (與MainActivity.java等效)

package com.manthan.geotag;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import android.widget.ToggleButton;

import java.io.IOException;

import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class RegisterActivity extends AppCompatActivity {

    /// DEBUG VARIABLES --- TO BE REMOVED WHEN FINALIZED //

    SharedPrefsCntr sharedPreferences;
    Boolean isLoggedIn;
    ToggleButton loggedIn_tb;

    ///////////////////////////////////////////////////////

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        assert fab != null;
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        ///// DEBUG CODE BELOW --- TO BE REMOVED WHEN FINALIZED /////

        ////THIS IS WHERE I CALL MY ASYNC CLASS WHICH TRIGGERS DATA TO BE SENT
        new Async().execute();

        sharedPreferences = new SharedPrefsCntr(RegisterActivity.this);
        isLoggedIn = sharedPreferences.loadBoolean("isLoggedIn");
        loggedIn_tb = (ToggleButton) findViewById(R.id.loggedInToggle);
        assert loggedIn_tb != null;
        if(isLoggedIn){
            loggedIn_tb.setChecked(true);
        }else{
            loggedIn_tb.setChecked(false);
        }

        loggedIn_tb.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (loggedIn_tb.isChecked()) {
                    sharedPreferences.saveBoolean("isLoggedIn", true);
                } else {
                    sharedPreferences.saveBoolean("isLoggedIn", false);
                }
            }
        });

        /////////////////////////////////////////////////////////////
    }



    ///// DEBUG CODE BELOW --- TO BE REMOVED WHEN FINALIZED /////

    public void getToken(View view){
        String Token = sharedPreferences.getToken();
        Toast.makeText(this,"Token : " + Token, Toast.LENGTH_LONG).show();
    }
}

這是Async.class

package com.manthan.geotag;

import android.os.AsyncTask;
import android.util.Log;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;

import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

/**
 * Created by Manthan on 10/09/2016.
 */
public class Async extends AsyncTask<Void, Void, String>{

    @Override
    protected String doInBackground(Void... params) {
        Log.i("Async", "doInBackground");
        return sendData();
    }

    @Override
    protected void onPostExecute(String s) {
        Log.i("Async","onPostExecute");
        Log.i("Async","onPostExecute : "+s);
    }

    private final OkHttpClient client = new OkHttpClient();

    public String sendData(){
        try {
            RequestBody formBody = new FormBody.Builder()
                    .add("Token", "TestToken")
                    .build();

            Request request = new Request.Builder()
                    .url("http://www.geotag.byethost8.com/tokenSave.php")
                    .post(formBody)
                    .build();

            Response response = client.newCall(request).execute();
            return response.body().string();
        } catch (IOException e) {
            return "Error: " + e.getMessage();
        }
    }

    public void DefaultHttpRequest(){

        Log.i("Async","nativehttp");
        String insert_url = "http://geotag.byethost8.com/tokenSave.php";

        try {
            URL url = new URL(insert_url);
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestMethod("POST");
            httpURLConnection.setDoOutput(true);
            httpURLConnection.connect();

            OutputStream outputStream = httpURLConnection.getOutputStream();
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream,"UTF-8"));

            String data = URLEncoder.encode("Token", "UTF-8")+"="+URLEncoder.encode("testTokenNative","UTF-8");

            bufferedWriter.write(data);
            bufferedWriter.flush();
            bufferedWriter.close();
            outputStream.close();

            InputStream inputStream = httpURLConnection.getInputStream();
            inputStream.close();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

如您所見,我還嘗試了Default Http request代碼,但不幸的是,該代碼也不起作用。

最后, tokenSave.php腳本

<?php
    $token = $_POST['Token'];
    $dt = date("l dS \of F Y h:i:s A");
    $file = fopen("Token_log.txt","a");
    $data = $token.' ---- '.$dt."\n";
    fwrite($file,$data);
    fclose($file);
    header("Location: /Token_log.txt");
?>

顯然,在logcat中沒有彈出錯誤,並且我在執行代碼時都沒有看到任何誤導(來自代碼中的Log.i)。

Okhttp網站上的示例代碼說明了如何發送JSON數據,在我的情況下也Okhttp此問題。

請隨時詢問日志

感謝你在期待。 :d


編輯

感謝您的回答Nitzan Tomar

我已經嘗試過您的代碼,並且可以正常運行,是的,我通過使用Level.BODY獲得了很多信息

我在這里聽起來可能很愚蠢,但我在日志中找不到任何錯誤,而且我的Token_log.txt中也沒有收到任何輸入(請在logcat第一行的網站上查看)

修改后的Async.class

package com.manthan.geotag;

import android.os.AsyncTask;
import android.util.Log;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;

import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;

/**
 * Created by Manthan on 10/09/2016.
 */
public class Async extends AsyncTask<Void, Void, String>{

    @Override
    protected String doInBackground(Void... params) {
        Log.i("Async", "doInBackground");
        return sendData();
    }

    @Override
    protected void onPostExecute(String s) {
        Log.i("Async","onPostExecute");
        Log.i("Async","onPostExecute : "+s);
    }

    //private final OkHttpClient client = new OkHttpClient();

    public String sendData(){

        HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
        logging.setLevel(HttpLoggingInterceptor.Level.BODY);

        OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(logging)
                .build();

        try {
            RequestBody formBody = new FormBody.Builder()
                    .add("Token", "TestToken")
                    .build();

            Request request = new Request.Builder()
                    .url("http://www.geotag.byethost8.com/tokenSave.php")
                    .post(formBody)
                    .build();

            Response response = client.newCall(request).execute();
            return response.body().string();
        } catch (IOException e) {
            return "Error: " + e.getMessage();
        }
    }

    public void DefaultHttpRequest(){

        Log.i("Async","nativehttp");
        String insert_url = "http://geotag.byethost8.com/tokenSave.php";

        try {
            URL url = new URL(insert_url);
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestMethod("POST");
            httpURLConnection.setDoOutput(true);
            httpURLConnection.connect();

            OutputStream outputStream = httpURLConnection.getOutputStream();
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream,"UTF-8"));

            String data = URLEncoder.encode("Token", "UTF-8")+"="+URLEncoder.encode("testTokenNative","UTF-8");

            bufferedWriter.write(data);
            bufferedWriter.flush();
            bufferedWriter.close();
            outputStream.close();

            InputStream inputStream = httpURLConnection.getInputStream();
            inputStream.close();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

和logcat(以OkHttp為中心)

09-12 21:05:59.565 20115-20238/com.manthan.geotag D/OkHttp: --> POST http://www.geotag.byethost8.com/tokenSave.php http/1.1
09-12 21:05:59.565 20115-20238/com.manthan.geotag D/OkHttp: Content-Type: application/x-www-form-urlencoded
09-12 21:05:59.575 20115-20238/com.manthan.geotag D/OkHttp: Content-Length: 15
09-12 21:05:59.575 20115-20238/com.manthan.geotag D/OkHttp: Token=TestToken
09-12 21:05:59.575 20115-20238/com.manthan.geotag D/OkHttp: --> END POST (15-byte body)
09-12 21:06:00.540 20115-20238/com.manthan.geotag D/OkHttp: <-- 200 OK http://www.geotag.byethost8.com/tokenSave.php (960ms)
09-12 21:06:00.540 20115-20238/com.manthan.geotag D/OkHttp: Server: nginx
09-12 21:06:00.540 20115-20238/com.manthan.geotag D/OkHttp: Date: Mon, 12 Sep 2016 15:37:06 GMT
09-12 21:06:00.540 20115-20238/com.manthan.geotag D/OkHttp: Content-Type: text/html
09-12 21:06:00.540 20115-20238/com.manthan.geotag D/OkHttp: Transfer-Encoding: chunked
09-12 21:06:00.540 20115-20238/com.manthan.geotag D/OkHttp: Connection: keep-alive
09-12 21:06:00.540 20115-20238/com.manthan.geotag D/OkHttp: Vary: Accept-Encoding
09-12 21:06:00.540 20115-20238/com.manthan.geotag D/OkHttp: Expires: Thu, 01 Jan 1970 00:00:01 GMT
09-12 21:06:00.540 20115-20238/com.manthan.geotag D/OkHttp: Cache-Control: no-cache
09-12 21:06:00.590 20115-20238/com.manthan.geotag D/OkHttp: <html><body><script type="text/javascript" src="/aes.js" ></script><script>function toNumbers(d){var e=[];d.replace(/(..)/g,function(d){e.push(parseInt(d,16))});return e}function toHex(){for(var d=[],d=1==arguments.length&&arguments[0].constructor==Array?arguments[0]:arguments,e="",f=0;f<d.length;f++)e+=(16>d[f]?"0":"")+d[f].toString(16);return e.toLowerCase()}var a=toNumbers("f655ba9d09a112d4968c63579db590b4"),b=toNumbers("98344c2eee86c3994890592585b49f80"),c=toNumbers("55b76e7339190a1f8aeb15c613083790");document.cookie="__test="+toHex(slowAES.decrypt(c,2,a,b))+"; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/"; location.href="http://www.geotag.byethost8.com/tokenSave.php?i=1";</script><noscript>This site requires Javascript to work, please enable Javascript in your browser or use a browser with Javascript support</noscript></body></html>
09-12 21:06:00.590 20115-20238/com.manthan.geotag D/OkHttp: <-- END HTTP (848-byte body)

另外,您認為這是服務器故障嗎?

okhttp默認情況下不會記錄日志,您需要添加一個日志記錄接收器以查看正在發生的情況。
幸運的是,來自Square好人已經創建了Logging Interceptor

您需要做的就是將其添加到gradle中:

dependencies {
    ...
    compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
    ...
}

然后,您需要像這樣構建OkHttpClient

HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(Level.BASIC);

OkHttpClient client = new OkHttpClient.Builder()
        .addInterceptor(logging)
        .build();

Level.BASIC不會給您太多,但是您還有兩個選擇: Level.HEADERSLevel.BODY ,它們將記錄更多信息。
您可能需要使用Level.BODY

看來問題出在托管服務提供商,而不是OkHttp。

一切都啟動並在新的托管服務上運行。

奇跡般有效。 :d

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM