2016-03-08 85 views
1

我正在使用Retrofit向服務器發送POST請求。 POST 的主體必須採用jdata={"key1":"value1",...}以及Content-Type標頭設置爲application/x-www-form-urlencoded。我發現一個similar的問題,但接受的答案是行不通的。Retrofit POST原始字符串正文

這裏就是我想 -

我的界面

public interface APIHandler { 
    @Headers("Content-Type: application/x-www-form-urlencoded") 
    @FormUrlEncoded 
    @POST(URL) 
    Call<ResponseBody> getdata(@Field("jdata") String jdata); 
} 

呼叫功能

public void load() { 
Retrofit retrofit = new Retrofit.Builder() 
     .baseUrl("BASE_URL") 
     .addConverterFactory(GsonConverterFactory.create()) 
     .build(); 

// prepare call in Retrofit 2.0 
APIHandler iAPI = retrofit.create(APIHandler.class); 

String requestBody = "{\"id\":\"value\",\"id1\":\"value2\"}" 
Call<ResponseBody> call = iAPI.getData(requestBody); 

call.enqueue(new Callback<ResponseBody>() { 
    @Override 
    public void onResponse(Call<ResponseBody> c, Response<ResponseBody> response) { 
     if (response.isSuccess()) { 
      ResponseBody result = response.body(); 
      String gs = new Gson().toJson(result); 
      Log.d("MainActivity", "response = " + gs + " status: " + statusCode); 

     } else { 
      Log.w("myApp", "Failed"); 
     } 
    } 

    @Override 
    public void onFailure(Call<ResponseBody> c, Throwable t) { 
    } 
}); 
} 

但我收到response = nullstatus = 200。我究竟做錯了什麼?預期的響應只是一個字符串而不是JSON數組。

+0

這個'{「key1」:「value1」,...}'是一個json數據。你可以使用gson將pojo轉換爲json對象,然後將其發佈到服務器 – Raghunandan

+0

是的,但我需要發佈'jdata = {「key1」:「value1」,...}'不是'{「key1」:「value1 「,...}' – jL4

+0

檢查toString方法@ http://developer.android.com/intl/es/reference/org/json/JSONObject.html – Raghunandan

回答

0

我在這裏離開這裏,以便它可以幫助別人。

上面的代碼是正確的。正如我在最後一行中提到的那樣,明確的字符串應該是預期的。但由於它不是JSON響應,轉換可能不起作用,響應爲空。我能找到的唯一的解決辦法是在響應直接轉換爲字符串 -

try { 
     stresp = response.body().string() 
     Log.d("MainActivity", "response = " + stresp + " status: " + statusCode); 
    } catch (IOException e) { 
        //Handle exception 
} 

有可能是一個更好的辦法來處理這個但爲我工作!