2017-02-08 135 views
1

早上好!REST POST請求無法在java上工作,但適用於REST客戶端

我用C#創建了一個REST服務,我試圖從android-studio發送一個post請求到URL。我的URL目前有兩種方法,GET和POST。 GET方法工作正常,我可以從android消耗沒有任何問題。但是,當涉及到POST請求時,我無法從android中使用它。

我已經測試了使用REST客戶端chrome插件的POST方法,它看起來像請求工作正常,我能夠達到該方法並執行任何代碼需要執行。以下證據:

請求數據:

Request data

請求響應:

Request response

下面的C#API:

[RoutePrefix("api/leads")] 
    public class LeadsController : ApiController 
    { 
     // GET: api/Leads/5 
     public List<Lead> Get(string matricula, int tipo) 
     { 
      List<Lead> leads = new List<Lead>(); 

      //Fills the list 

      return leads; 
     } 

     [HttpPost] 
     // POST: api/Leads 
     public bool Post(int id, string usuario, string latitude, string longitude) 
     { 
      //Do stuff 

      return true; 
     } 
} 

最後,但並非最不重要,我是的java代碼使用對POST請求:

@Override 
    protected String doInBackground(String... strings) { 
     URL url = null; 
     try { 
      String newUrl = getNewUrl(); 

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

      url = new URL(newUrl); 

      byte[] postDataBytes = postData.toString().getBytes("UTF-8"); 

      HttpURLConnection conn = (HttpURLConnection)url.openConnection(); 
      conn.setDoOutput(true); 
      conn.setDoInput(true); 
      conn.setRequestMethod("POST"); 
      conn.setRequestProperty("Content-Type", "application/json; charset=utf-8"); 
      conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length)); 


      conn.getOutputStream().write(postDataBytes); 

      int responseCode = conn.getResponseCode(); 
      if(responseCode == HttpURLConnection.HTTP_OK){ 
       server_response = readStream(conn.getInputStream()); 
      } 

     } catch (MalformedURLException e) { 
      listener.onPostResponse(false, e.getMessage(), this.tipoAcesso); 
     } catch (UnsupportedEncodingException e) { 
      listener.onPostResponse(false, e.getMessage(), this.tipoAcesso); 
     } catch (ProtocolException e) { 
      listener.onPostResponse(false, e.getMessage(), this.tipoAcesso); 
     } catch (IOException e) { 
      listener.onPostResponse(false, e.getMessage(), this.tipoAcesso); 
     } 
     return null; 
    } 

,該方法getNewUrl()的返回是在URL: 「https://cliente.teleatlantic.com.br/CheckinLeads/api/Leads/」。

的參數是: 「usuario = FERNANDOCHAVES &緯度= -46.6903502 &經度= -46.6903502 & ID = 265857」

我看了不知疲倦地在互聯網上(包括在此論壇)爲固定的方式我的問題與POST請求。但是我找到的解決方案都沒有解決我的問題。

我到目前爲止試過的東西:
1.添加「?」在POST請求中發送參數之前。
2.Append「/ CheckinLeads/api/Leads?」之前的參數。
3.更改代碼以使用HttpClient而不是HttpURLConnection。
4.將內容數據更改爲「text/json」。
5.使用HttpURLConnection和HttpClient的許多「準備使用」功能。

我是新來的java/android和任何幫助,將不勝感激。
我正在使用4.4 Android KitKat SDK版本24.
感謝您的關注!最好的祝福。

-----編輯-----
代碼不會崩潰。但是,當我檢查請求的HttpURLConnection.getResponseCode時,它顯示了404。但是,我發送的URL和參數與用於在REST客戶端中測試的URL和參數相同。

+0

'我不能夠從android'究竟如何使用呢?究竟是什麼錯誤?它會崩潰嗎?返回錯誤的結果?返回錯誤?... –

+0

它不會崩潰,只是沒有到達服務器。如果我檢查HttpUrlConnection.getResponseCode();它顯示我一個404.但請求的URL和參數是正確的。我看不到我錯過了什麼。 – Abner

+0

可以從你的android https://cliente.teleatlantic.com.br/CheckinLeads/api/Leads?usuario=FERNANDOCHAVES&latitude=-46.6903502&longitude=-46.6903502&id=265857 內容類型調用下面靜態URL =一次「應用程序/ x-www-form-urlencoded「 –

回答

2
Change the api code 

public class test { 
public int id {get;set;} 
public string usuario {get;set;} 
public string latitude {get;set;} 
public string longitude { get; set; } 
} 

[HttpPost] 
// POST: api/Leads 
public bool Post(test objTest) 
{ 
//Do stuff return true; 
} 
1

您正在發佈數據到服務器,但您的參數不是JSON格式,因此您需要使用application/x-www-form-urlencoded對參數進行編碼。

嘗試:

conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 

而且看看this

+0

感謝您的回覆。我嘗試過設置此屬性,它只是不起作用。仍然獲得404作爲對請求的響應。 – Abner