2015-02-04 12 views
7

com.android.volley.NoConnectionError: java.net.ProtocolException: Phương thức không xác định 'PATCH'; phải là một trong số [OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE]Lỗi trong Volley Patch

StringRequest putRequest = new StringRequest(Request.Method.PATCH, url, 
       new Response.Listener<String>() 
       { 
        @Override 
        public void onResponse(String response) 
        { 

         Log.d("Response", response); 

        } 
       }, 
       new Response.ErrorListener() 
       { 
         @Override 
         public void onErrorResponse(VolleyError error) 
         { 


          Log.d("Error.Response", error.toString()); 

        } 
       } 
      ) { 

       @Override 
       protected Map<String, String> getParams() 
       { 
         Map<String, String> params = new HashMap<String, String>(); 
         params.put("name", "My Name"); 
         params.put("age", "11"); 

         return params; 
       } 

      }; 

Trả lời

20

Bạn có chắc chắn đang sử dụng đúng phiên bản Thư viện Volley không? Tôi đã thử mã của bạn trong Lollipop và nó đang hoạt động OK. Nếu bạn đang sử dụng thư viện Volley làm dự án bên ngoài, hãy kiểm tra giao diện Phương thức của lớp Yêu cầu trong gói com.android.volley. Nó sẽ có một biến PATCH trong đó.

public interface Method { 
     int DEPRECATED_GET_OR_POST = -1; 
     int GET = 0; 
     int POST = 1; 
     int PUT = 2; 
     int DELETE = 3; 
     int HEAD = 4; 
     int OPTIONS = 5; 
     int TRACE = 6; 
     int PATCH = 7; 
    } 

Nếu không, hãy sử dụng phiên bản mới nhất của thư viện Volley.

CẬP NHẬT:

Bạn chính xác, nó đang hiển thị lỗi này ở Kitkat, nhưng không hiển thị trong Lollipop. Tôi đoán vấn đề chính là HTTPUrlConnection của Java không hỗ trợ PATCH. (Tôi đoán nó hoạt động trong Lollipop vì nó đang sử dụng Java 7 và HTTPUrlConnection của Java 7 hỗ trợ phương pháp PATCH?) Nhưng dù sao, bạn có thể sử dụng Thư viện OkHttp để khắc phục sự cố này. Các module okhttp-URLConnection thực hiện các java.net.HttpURLConnection

Thêm jar sau vào thư mục libs của bạn:
okhttp-2.2.0.jar
okhttp-urlconnection-2.2.0.jar
okio-1.2.0.jar

Tạo một lớp OkHttpStack:

package com.example.temp;  

import java.io.IOException; 
import java.net.HttpURLConnection; 
import java.net.URL; 

import com.android.volley.toolbox.HurlStack; 
import com.squareup.okhttp.OkHttpClient; 
import com.squareup.okhttp.OkUrlFactory; 

public class OkHttpStack extends HurlStack { 
    private final OkUrlFactory mFactory; 

    public OkHttpStack() { 
     this(new OkHttpClient()); 
    } 

    public OkHttpStack(OkHttpClient client) { 
     if (client == null) { 
      throw new NullPointerException("Client must not be null."); 
     } 
     mFactory = new OkUrlFactory(client); 
    } 

    @Override protected HttpURLConnection createConnection(URL url) throws IOException { 
     return mFactory.open(url); 
    } 
} 

Sử dụng hàm tạo sau để tạo một Yêu cầu về số_thư:

Volley.newRequestQueue(getApplicationContext(),new OkHttpStack()).add(putRequest); 

Tính năng này hiện đang hoạt động trên Kitkat.

+0

sử dụng phiên bản mới nhất và PATCH được khai báo bên trong Lớp yêu cầu – sreejith

+0

Tôi đã cập nhật câu trả lời. – User31689

+0

cảm ơn bạn đã cập nhật. của nó làm việc – sreejith

-1

Trong khi gửi yêu cầu, hãy sử dụng POST. Trong tiêu đề chỉ ghi đè lên phương pháp http để PATCH. Đối với tôi bây giờ nó làm việc trong bóng chuyền ngay cả trong phiên bản kitkat.

header.put("X-HTTP-Method-Override", "PATCH"); 
+0

máy chủ của bạn nên cho phép Ghi đè phương pháp để cho phép tác vụ này hoạt động –