2017-05-31 169 views
0

在Android Web服務使用POST方法的REST模板,我試圖發送一個對象到服務器,其中包含幾個參數和2個對象。這兩個對象包含幾個參數和3個不同對象的列表,並且這3個對象列表中的每一個都包含其中的少量參數以及1個僅包含字節數組的對象列表。像在下面的圖片:org.springframework.web.client.HttpClientErrorException:415不支持的媒體類型[編輯]

產品圖1 [主要對象(一個我想發送)〕:

Main Object(The one I am trying to send)

產品圖2包括對象的3只列出了主要對象內對象]:

Object inside the Main Object comprising 3 Lists of Objects

產品圖3的爲包含1個列表內它的另一個對象的,同樣對其他2(住宿&其他)列表對象]:

An Object as List comprising 1 List of Another Object inside it, likewise for the other 2(Accommodation & Others)

產品圖4僅含有一個牛欄數組參數子對象內的對象的列表]:

List of Object inside the sub-Object containing a byre array parameter alone

而我的用於web服務POST方法的代碼:

public static final String capUrl = "http://192.168.1.7:8084/CAPWS"; 

public Expenses setExpensesByBatch(Expenses expenses) { 

    try { 

     StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
     StrictMode.setThreadPolicy(policy); 

     RestTemplate restTemplate = new RestTemplate(); 
     restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); 
     restTemplate.getMessageConverters().add(new StringHttpMessageConverter()); 
     restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory()); 

     List<HttpMessageConverter<?>> list = new ArrayList<HttpMessageConverter<?>>(); 
     list.add(new MappingJacksonHttpMessageConverter()); 
     restTemplate.setMessageConverters(list); 


     String b = restTemplate.postForObject(capUrl + "/UX/", expenses, String.class); 

     Log.e("String ===============b", b + "  ++++"); 

    } catch (Exception e) { 
     e.printStackTrace(); 
     Log.e("expObjPost_WsCli_EX", e.toString()); 
    } 
    return expenses; 
} 

無論我做什麼回報org.springframework.web.client.HttpClientErrorException: 415 Unsupported Media Type

LOGCAT如下:

LOGCAT

我的服務器端代碼:

@RequestMapping(value = CapRestURIConstants.UPDATEEXPENSES, method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) 
public @ResponseBody 
String updateExpenses(@RequestBody Expenses expenses) { 
    String response = "true"; 

    System.out.println("incoming--------" + "UPDATEEXPENSES"); 
    try { 
     if (expenses != null) { 
      //System.out.println("expenses--------" + expenses); 

      int catType = expenses.getCategoryType(); 
      String categoryType = String.valueOf(catType); 

      String categoryId = expenses.getCategoryId(); 
      String batchId = expenses.getBatchId(); 

      System.out.println("categoryType--------" + categoryType); 
      System.out.println("categoryId--------" + categoryId); 
      System.out.println("batchId--------" + batchId); 

      Batch batch = getBatchById(batchId); 
      if (batch != null) { 

       expenseDataNew(batch, expenses); 
       expenseImagesNew(batch, expenses); 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
     response = "faslse"; 
    } 
    return response; 
} 

public void expenseDataNew(Batch batch, Expenses expenses) { 

    Session session = null; 
    Transaction transaction = null; 
    Gson gson = new Gson(); 

    try { 

     LinkedTreeMap masterMap = (LinkedTreeMap) gson.fromJson(batch.getMasterJson(), Object.class); 
     LinkedTreeMap expenseObject = (LinkedTreeMap) masterMap.get("2007"); 

     masterMap.replace(expenseObject, expenses); 
     String masterJson = gson.toJson(masterMap); 
     batch.setMasterJson(masterJson); 

     session = HibernateUtil.getSessionFactory().openSession(); 
     transaction = session.beginTransaction(); 
     session.saveOrUpdate(batch); 

     transaction.commit(); 

    } catch (Exception e) { 
     if (transaction != null) { 
      transaction.rollback(); 
     } 
     e.printStackTrace(); 
    } finally { 
     if (session != null) { 
      session.close(); 
     } 
    } 
} 

public void expenseImagesNew(Batch batch, Expenses expenses) { 

    Session session = null; 
    Transaction transaction = null; 
    Gson gson = new Gson(); 

    try { 

     // DIVERTING TO IMAGE DB 
     session = ImageHibernateUtil.getSessionFactory().openSession(); 
     transaction = session.beginTransaction(); 

     if (expenses != null) { 


      int catType = expenses.getCategoryType(); 
      String categoryType = String.valueOf(catType); 
      System.out.println("categoryType--------" + categoryType); 

      String categoryId = expenses.getCategoryId(); 
      System.out.println("categoryId--------" + categoryId); 

      String travelExpenseImgId = "f257f225-41da-11e7-be05-001d92ba9634"; 
      String accommodationExpenseImgId = "204b4baf-41db-11e7-be05-001d92ba9634"; 
      String otherExpenseImgId = "45d31872-41db-11e7-be05-001d92ba9634"; 

      AssessorExpense assessorExpense = expenses.getAssessorExpense(); 
      TCExpense tCExpense = expenses.getTcExpense(); 

      Boolean isTravel, isAccomadation, isOthers; 

      List<Travel> travelList; 
      List<Accomadation> accommodationList; 
      List<Others> othersList; 

      ArrayList proof; 
      Expense expense; 
      ExpenseImage expenseImage; 

      // categoryType: 1 = Assessor 
      // categoryType: 4 = TC 
      if (categoryType.equals("1")) { 

       if (assessorExpense != null) { 

        isTravel = assessorExpense.isTravel(); 
        if (isTravel) { 

         travelList = (ArrayList) assessorExpense.getTravel(); 
         System.out.println("travelList.size()==" + travelList.size()); 

         expense = getExpense(travelExpenseImgId); 
         System.out.println("expense==travel==1==:" + expense); 
         String expenseStr = String.valueOf(expense); 
         System.out.println("expenseStr==travel==1==:" + expenseStr); 


         for (Travel travel : travelList) { 

          List<ExpenseImageObject> expenseImageObjects = (ArrayList) travel.getExpenseImageObjects(); 
          System.out.println("travel==expenseImageObjects.size()== :" + expenseImageObjects.size()); 

          for (ExpenseImageObject image : expenseImageObjects) { 

           System.out.println("expense===travel==for==:" + expense); 

           expenseImage = new ExpenseImage(); 

           expenseImage.setBatchId(batch.getBatchId()); 
           expenseImage.setCategoryId(expenses.getCategoryId()); 
           expenseImage.setExpimgId(expenseStr); 
           expenseImage.setImage(image.getImage()); 
           expenseImage.setStatus(1); // dummy status 1 - Travel, 2 - Accommodation, 3 - Other 

           session.saveOrUpdate(expenseImage);          
          } 
         } 
        } 
       } 
      } 
     } 
     transaction.commit(); 

    } catch (Exception e) { 
     if (transaction != null) { 
      transaction.rollback(); 
     } 
     e.printStackTrace(); 
    } finally { 
     if (session != null) { 
      session.close(); 
     } 
    } 
} 

我實際上是想發送對象的數據爲每個列表服務器的照片以及目錄列表。 瀏覽了幾個網站和幾乎所有與Stack Overflow上的錯誤有關的主題,在這個問題上已經持續了一個多星期。希望我能找到一些幫助。

+0

我們必須看到您的端點所期望的。 – user2447161

+0

我收到一個錯誤,指出'org.springframework.web.client.HttpClientErrorException:415 Unsupported Media Type'。我甚至沒有在服務器端得到任何日誌 – sam

回答

0

地獄大量的研究和專家建議後,我終於找到了解決我的問題。問題不在代碼中。它其實是完美的。問題出在我用來獲取&集合的對象。我正在使用NetBeans進行服務器端編碼。我所做的就是,我創建了的Android工作室我需要的對象,複製參數干將&制定者和粘貼他們的NetBeans,Object類。問題在於我一直在使用的布爾值。在上創建的布爾值在某些情況下,Android Studio不支持NetBeans,因爲這樣會阻止訪問服務器。並獲得專家的意見後,我做了的NetBeans對象創建複製參數干將&制定者和粘貼他們Android Studio中 Object類。然後它運作良好。花了我2個多星期來解決這個問題。希望這會有所幫助。

0

更改調用像這樣

HttpHeaders headers = new HttpHeaders(); 
headers.setContentType(MediaType.APPLICATION_JSON); 
headers.add("Accept","application/json;charset=utf-8"); 

RestTemplate restTemplate = new RestTemplate(); 
... 
HttpEntity request = new HttpEntity(req, headers); 
responseEntity = restTemplate.exchange(url, HttpMethod.POST, request, 
    String.class); 

指定內容類型

UPDATE

req,其實是身體,你發送給服務器。它可以是例如

MultiValueMap<String, Object> req ... 

在那裏你實際上發送請求正文和標題。

+0

請你詳細說明最後2行'HttpEntity request = new HttpEntity(req,headers); responseEntity = restTemplate.exchange(url,HttpMethod.POST,request, String.class);' – sam

+0

答案已更新 – StanislavL

0

嘗試使用「HttpHeaders」將content-type頭明確設置爲端點預期的內容。 然後,您將「HttpEntity」用於頭和身體課程。 例子:

HttpHeaders requestHeaders = new HttpHeaders(); 
    requestHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED); 
    HttpEntity<String> httpEntity = new HttpEntity<>("my body", requestHeaders); 

    byte[] response = restTemplate.postForObject(
      "URL", httpEntity, byte[].class); 
相關問題