2013-10-24 44 views
0

我已經開發了一個小的android應用程序,通過Http協議與服務器通信,使用json對象。如何正確形成Android HttpPost請求 - 服務器響應''406不可接受''

它在我的本地機器上工作得很好,但是當我決定(只是在學習目的)上傳我的PHP腳本到一些免費託管Web服務時,我得到了406錯誤。

我已經做了一些研究,發現它必須是我的HttpPost請求中沒有設置Content-type。但是設置Content-type沒有幫助。

這是Android代碼:

  ArrayList<NameValuePair> userData = new ArrayList<NameValuePair>(); 
      userData.add(new BasicNameValuePair("email", userData_email)); 
      userData.add(new BasicNameValuePair("pass", userData_pass)); 

      HttpParams httpParameters = new BasicHttpParams(); 
      HttpConnectionParams.setConnectionTimeout(httpParameters, 10000); 
      HttpConnectionParams.setSoTimeout(httpParameters, 10000); 

      HttpClient client = new DefaultHttpClient(httpParameters); 

      HttpPost postRequest = new HttpPost(uri); 

      // I tried this too 
      // postRequest.setHeader("Content-Type", "application/json"); 

      UrlEncodedFormEntity ent = new UrlEncodedFormEntity(userData); 

      ent.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); 

      postRequest.setEntity(ent); 

      HttpResponse response = client.execute(postRequest); 

      HttpEntity entity = response.getEntity(); 

      String result = EntityUtils.toString(entity); 

      Log.e("SERVER: ", result); 

      JSONObject json = new JSONObject(result); 

      userData_fname = json.getString("fname"); 
      userData_lname = json.getString("lname"); 
      userData_age = json.getInt("age"); 
      userData_gender = json.getString("gender"); 

這是從服務器(真的沒有什麼花哨)代碼:

$mysql_host = 'xxxx'; 
$mysql_user = 'xxxx'; 
$mysql_pass = 'xxxx'; 
$mysql_db = 'xxxx'; 

if (isset($_POST["email"]) && isset($_POST["pass"])) { 
$email = $_POST["email"]; 
$pass = $_POST["pass"]; 

if(!mysql_connect($mysql_host, $mysql_user, $mysql_pass) || !mysql_select_db($mysql_db)) { 
    echo '-1'; 
} 

$query = "SELECT * FROM `users` WHERE `email`='".$email."' AND `password`='".$pass."'"; 
if($query_run = mysql_query($query)){ 

    $firstname = mysql_result($query_run, 0, 'firstname'); 
    $lastname = mysql_result($query_run, 0, 'lastname'); 
    $age = mysql_result($query_run, 0, 'age'); 
    $gender = mysql_result($query_run, 0, 'gender'); 

    $return_data = array (
     'fname' => $firstname, 
     'lname' => $lastname, 
     'age' => $age, 
     'gender' => $gender 
    ); 

    echo json_encode($return_data); 

} else { 
    echo 'not found'; 
    exit(); 
    } 
} 

現在,它可能是一些與我的PHP代碼(失蹤可能有些東西),但是因爲我只知道php的基礎知識,所以我在尋求幫助。

預先感謝您。

回答

0

如果你想確定你的php代碼,你必須從瀏覽器打開該頁面,如果你會看到你的數據在JSON格式,然後服務器工作正常!否則你的服務器不會檢索json_encode()函數。

+0

服務器運行良好。當我從瀏覽器發佈它時,它會返回json字符串。 –

+0

好。也許你的問題是在Http連接。您是否將Internet權限列入清單?它允許你的應用程序打開網絡套接字。讓我知道。 – Emisilve86

+0

<使用權限android:name =「android.permission.INTERNET」/> <使用權限android:name =「android.permission.ACCESS_NETWORK_STATE」/> – Emisilve86

1

您更改:

HttpParams httpParameters = new BasicHttpParams(); 
HttpConnectionParams.setConnectionTimeout(httpParameters, 10000); 
HttpConnectionParams.setSoTimeout(httpParameters, 10000);` 
HttpClient client = new DefaultHttpClient(httpParameters); 

要:

HttpClient httpclient = new DefaultHttpClient(); 
HttpConnectionParams.setConnectionTimeout(httpclient.getParams(), 
      timeOut); 
HttpConnectionParams.setSoTimeout(httpclient.getParams(), timeOut);` 

當然,它的工作原理。