2016-03-03 42 views
2

目前,我正在使用Android與Retrofit 2.0.0-beta4和OkHttp3。我做的定義是這麼@PUT要求:將@PUT與改進版2和OkHttp3一起使用

@Headers({ 
     Constants.CONTENT_TYPE_HEADER + ": " + Constants.JSON_HEADER_VAL, 
     Constants.ACCEPT_HEADER + ": " + Constants.JSON_HEADER_VAL 
}) 
@PUT(Constants.PUT_SKILL_LEVEL) 
Call<EmployeeSkill> updateEmpSkillLevel(@Header(Constants.SESSION_COOKIE_NAME) String cookieValue, @Body EmployeeSkillRequest employeeSkillUpdate); 

終點放在這裏:http://apps:8080/employeeSkillsService/employeeSkill。下面是從PUT請求輸出日誌:

D/OkHttp﹕ --> PUT http://apps:8080/employeeSkillsService/employeeSkill http/1.1 
D/OkHttp﹕ Content-Type: application/json;charset=UTF-8 
D/OkHttp﹕ Content-Length: 99 
D/OkHttp﹕ Accept: application/json 
D/OkHttp﹕ JSESSIONID: D147377AB60AFE499D2A1AAF7C93F7A3 
D/OkHttp﹕ {"employee":{"id":63},"skill":{"isPrimary":false,"isSecondary":false,"id":3},"skillLevel":{"id":5}} 
D/OkHttp﹕ --> END PUT (99-byte body) 
<-- 404 Not Found http://apps:8080/employeeSkillsService/app.html (23ms) 
D/OkHttp﹕ Server: Apache-Coyote/1.1 
D/OkHttp﹕ X-Content-Type-Options: nosniff`D/OkHttp﹕ X-XSS-Protection: 1; mode=block` 
D/OkHttp﹕ X-XSS-Protection: 1; mode=block 
D/OkHttp﹕ Cache-Control: no-cache, no-store, max-age=0, must-revalidate 
D/OkHttp﹕ Pragma: no-cache 
D/OkHttp﹕ Expires: 0 
D/OkHttp﹕ X-Frame-Options: DENY 
D/OkHttp﹕ Content-Type: text/html;charset=utf-8 
D/OkHttp﹕ Content-Language: en 
D/OkHttp﹕ Content-Length: 1029 
D/OkHttp﹕ Date: Mon, 07 Mar 2016 15:39:35 GMT 
D/OkHttp﹕ OkHttp-Sent-Millis: 1457365206407 
D/OkHttp﹕ OkHttp-Received-Millis: 1457365206412 
D/OkHttp﹕ <html><head><title>Apache Tomcat/7.0.52 (Ubuntu) - Error report</title><style><!--H1 
{font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 
{font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 
{font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B{font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--></style> </head><body><h1>HTTP Status 404 - /employeeSkillsService/app.html</h1><HR size="1" noshade="noshade"><p><b>type</b> Status report</p><p><b>message</b> <u>/employeeSkillsService/app.html</u></p><p><b>description</b> <u>The requested resource is not available.</u></p><HR size="1" noshade="noshade"><h3>Apache Tomcat/7.0.52 (Ubuntu)</h3></body></html> 
D/OkHttp﹕ <-- END HTTP (1029-byte body) 

我在郵差證實在Chrome這個端點與這些報頭和有效載荷的作品多次。然而,當我使用Retrofit時,儘管端點在Postman中工作,我仍然收到404錯誤。下面是代碼調用:

Call<EmployeeSkill> updateEmployeeSkillCall = RetrofitApiRestClient.getApiClient().updateEmpSkillLevel(cookieValue, employeeSkillUpdate); 

updateEmployeeSkillCall.enqueue(new Callback<EmployeeSkill>() { 

    @Override 
    public void onResponse(Call<EmployeeSkill> call, Response<EmployeeSkill> response) { 
     // called when response HTTP status is "200 OK" 
     if (response.isSuccess()) { 
      holder.spnSkillLevel.setTag(pos); 
      Toast.makeText(mContext, holder.tvSkillName.getText() + mContext.getString(R.string.skill_updated_success_text) 
       + holder.spnSkillLevel.getSelectedItem().toString(), Toast.LENGTH_LONG).show(); 

      List<EmployeeSkill> updateEmployeeSkillsRow = EmployeeSkill.find(EmployeeSkill.class, "employee = ? and skill = ?", 
       response.body().getEmployee().getId().toString(), response.body().getSkill().getId().toString()); 

      EmployeeSkill updatedSkill = updateEmployeeSkillsRow.get(0); 
      updatedSkill.setSkillLevel(response.body().getSkillLevel()); 
      updatedSkill.setTimeUpdated(response.body().getSkillLevel().getTimeUpdated()); 
      updatedSkill.save(); 
     } 
    } 

    @Override 
    public void onFailure(Call<EmployeeSkill> call, Throwable throwable) { 
     Toast.makeText(mContext, holder.tvSkillName.getText() + mContext.getString(R.string.skill_update_failed_text), Toast.LENGTH_LONG).show(); 
    } 
}); 

我試圖改變所述@Body參數JSON字符串,但我接收到指出,JSON必須以與陣列或對象開始一個錯誤。在這個問題上的任何幫助將是有益的。如果沒有這個功能,如果找不到解決方案,我將被迫刪除Retrofit,而我並不真的期望這樣做。

+0

您確定該方法是PUT而不是POST嗎?你可以發佈使用改造的請求嗎?如果Web服務希望方法不是PUT(即POST,GET),即使URL和標頭都是正確的,你也會得到一個404。 – Luis

+0

我可以驗證PUT在使用郵遞員時的確切JSON有效負載的工作。但這是令人困惑的部分。 「404」不應該發生。這裏是使用Retrofit的響應:'D/OkHttp:< - 404 Not Found http:// apps:8080/employeeSkillsService/app.html(27ms)' – Chronos01

+0

嘗試使用RequestBody以及得到相同的響應 – Chronos01

回答

0

使用Fiddler2解決了我自己的問題。如果cookie名稱和值不正確。郵差可能更容忍它如何發送東西,而不是改造和其他人這樣做。但是從中學到了一些東西。感謝所有的幫助。