任何人都有一個例子,你在哪裏閱讀protobuf,使用凌空?我讀過你可以實現ProtobufRequest類,但我找不到它的文檔。感謝您的幫助。如何使用volley請求protobuf?
1
A
回答
-1
這並不是一個例子,我還沒有(還)做自己,但這裏是我會怎麼做:
的方法之一是擴大JsonObjectRequest和序列化,並使用反序列化每個協議緩衝區JSON:
Message someProto = SomeProto.getDefaultInstance();
String jsonFormat = JsonFormat.printToString(someProto);
Message.Builder builder = SomeProto.newBuilder();
String jsonFormat = _load json document from a source_;
JsonFormat.merge(jsonFormat, builder);
參見:https://code.google.com/p/protobuf-java-format/
否則,如果你要發送的協議緩衝序列化的byte []可以擴展Request<T>
。您將覆蓋請求正文/有效內容的public byte[] getBody()
,並且 保護Response<Message> parseNetworkResponse(NetworkResponse response)
獲得答案。
然後,您將使用以下函數序列化協議緩衝區。
byte[] toByteArray();
parseFrom(byte[] data);
如果您有解決方案,請不要忘記分享。
1
我已經做好了,工作很好,希望它有幫助。首先創建如下的ProtobufRequest類,繼承Request,Request是基本的請求類,然後,你可以創建自定義請求extends ProtobufRequest做自定義的doParse()。只是作爲參考。
是的RequestData消息SomeProto,
private static final int SOCKET_TIMEOUT = 30000;
/** Content type for request. */
private static final String PROTOCOL_CONTENT_TYPE = "application/x-protobuf";
private static final Object sDecodeLock = new Object();
private RequestData mRequestData;
private BaseCallback mCallback;
public ProtobufRequest(RequestData data, BaseCallback callback) {
super(Method.POST, Constants.SERVER_URL, callback);
// TODO Auto-generated constructor stub
mRequestData = data;
mCallback = callback;
this.setRetryPolicy(getRetryPolicy());
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> headers = new HashMap<String, String>();
headers.put("Charset", "UTF-8");
headers.put("Content-Type", "application/x-protobuf");
headers.put("Accept", "application/x-protobuf");
return headers;
}
@Override
public String getBodyContentType() {
return PROTOCOL_CONTENT_TYPE;
}
@Override
public RetryPolicy getRetryPolicy() {
RetryPolicy retryPolicy = new DefaultRetryPolicy(SOCKET_TIMEOUT,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
return retryPolicy;
}
/**
** write the protobuf data to http request,it is very important
*/
@Override
public byte[] getBody() throws AuthFailureError {
if (mRequestData == null) {
return super.getBody();
} else {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
baos.write(mRequestData.toByteArray());
} catch (IOException e) {
return super.getBody();
}
return baos.toByteArray();
}
}
@Override
protected void deliverResponse(Object arg0) {
mCallback.onResponse(arg0);
}
/**
** parse the response result
*/
@Override
protected Response<T> parseNetworkResponse(NetworkResponse response) {
synchronized (sDecodeLock) {
try {
return doParse(response, HttpHeaderParser.parseCacheHeaders(response));
} catch (OutOfMemoryError e) {
return Response.error(new ParseError(e));
}
}
}
abstract protected Response<T> doParse(NetworkResponse response, Entry entry)
public interface BaseCallback extends Listener<Object>, ErrorListener {
}
-1
以防萬一,在這裏堅持這一點,是非常有用的: 我搜索周圍很多的普通的方式做類似jeff wang的答案的東西。我找不到任何東西,所以我寫了這個。 讓我知道,如果你有什麼辦法來擺脫在那裏選中投...
ProtobufRequest.java
public class ProtoBufRequest<ReqT extends Message, RespT extends Message> extends Request<RespT> { private ReqT request; private final Class<RespT> responseType; private final Listener<RespT> listener; private static final String PROTOCOL_CONTENT_TYPE = "application/x-protobuf"; private static final int SOCKET_TIMEOUT = 30000; public ProtoBufRequest(int method, String url, ReqT data, Class<RespT> responseType, Listener<RespT> listener, Response.ErrorListener errorListener) { super(method, url, errorListener); this.listener = listener; this.request = data; this.responseType = responseType; } @Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String, String> headers = new HashMap<String, String>(); headers.put("Charset", "UTF-8"); headers.put("Content-Type", PROTOCOL_CONTENT_TYPE); headers.put("Accept", PROTOCOL_CONTENT_TYPE); return headers; } @Override public byte[] getBody() throws AuthFailureError { if (request == null) { return super.getBody(); } return request.toByteArray(); } @Override protected Response<RespT> parseNetworkResponse(NetworkResponse response) { try { if (responseType == null) { throw new IllegalArgumentException("The response type was never provided."); } RespT responseInstance = responseType.newInstance(); return (Response<RespT>) Response.success( responseInstance.newBuilderForType().mergeFrom(response.data).build(), HttpHeaderParser.parseCacheHeaders(response)); } catch (Exception e) { e.printStackTrace(); return Response.error(new ParseError(e)); } } @Override public String getBodyContentType() { return PROTOCOL_CONTENT_TYPE; } @Override public RetryPolicy getRetryPolicy() { RetryPolicy retryPolicy = new DefaultRetryPolicy(SOCKET_TIMEOUT, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT); return retryPolicy; } @Override protected void deliverResponse(RespT response) { listener.onResponse(response); } }
0
來源:cmcneil添加的代碼的情況下,鏈接腐爛。最終應由Volley或Protocol Buffers正式實施,因此請在必要時更新。
import com.android.volley.AuthFailureError;
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.Response.Listener;
import com.android.volley.RetryPolicy;
import com.android.volley.toolbox.HttpHeaderParser;
import com.google.protobuf.MessageLite;
import java.util.HashMap;
import java.util.Map;
/**
* Created by [email protected] on 5/10/15.
*/
public class ProtoBufRequest<ReqT extends MessageLite, RespT extends MessageLite> extends Request<RespT> {
private ReqT request;
private final Class<RespT> responseType;
private final Listener<RespT> listener;
private static final String PROTOCOL_CONTENT_TYPE = "application/x-protobuf";
private static final int SOCKET_TIMEOUT = 30000;
public ProtoBufRequest(int method, String url, ReqT data, Class<RespT> responseType,
Listener<RespT> listener, Response.ErrorListener errorListener) {
super(method, url, errorListener);
this.listener = listener;
this.request = data;
this.responseType = responseType;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> headers = new HashMap<String, String>();
headers.put("Charset", "UTF-8");
headers.put("Content-Type", PROTOCOL_CONTENT_TYPE);
headers.put("Accept", PROTOCOL_CONTENT_TYPE);
return headers;
}
@Override
public byte[] getBody() throws AuthFailureError {
if (request == null) {
return super.getBody();
}
return request.toByteArray();
}
@Override
protected Response<RespT> parseNetworkResponse(NetworkResponse response) {
try {
if (responseType == null) {
throw new IllegalArgumentException("The response type was never provided.");
}
RespT responseInstance = responseType.newInstance();
return (Response<RespT>) Response.success(
responseInstance.newBuilderForType().mergeFrom(response.data).build(),
HttpHeaderParser.parseCacheHeaders(response));
} catch (Exception e) {
e.printStackTrace();
return Response.error(new ParseError(e));
}
}
@Override
public String getBodyContentType() {
return PROTOCOL_CONTENT_TYPE;
}
@Override
public RetryPolicy getRetryPolicy() {
RetryPolicy retryPolicy = new DefaultRetryPolicy(SOCKET_TIMEOUT,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
return retryPolicy;
}
@Override
protected void deliverResponse(RespT response) {
listener.onResponse(response);
}
}
相關問題
- 1. 如何使用Volley解析JSON請求?
- 2. 如何使用Volley發送POST請求
- 3. 使用Volley的JSON請求
- 4. android post請求使用volley
- 5. Volley POST請求
- 6. 的Android -Volley通用請求
- 7. Volley同步請求
- 8. 使用Volley的HTTP Post請求
- 9. 使用Android Volley的HTTPS請求
- 10. 使用Volley GET請求參數
- 11. 使用Volley從http請求返回值
- 12. Android Volley請求使用OAuth2授權
- 13. 使用Volley執行單個請求
- 14. 使用Google Volley發送請求參數
- 15. 如何在android中使用volley庫調用graphql post請求
- 16. 如何使用Volley網絡請求隊列?
- 17. 如何使用volley與字符串正文發送POST請求?
- 18. 如何使用沒有HttpEntity的Volley發送多部分請求?
- 19. 如何使用volley請求和glide/picasso加載gridview?
- 20. 如何使用Android中的Volley發送Post請求?
- 21. 如何使用Android Volley顯示/請求JSON對象?
- 22. 如何使用volley發送POST請求到IP地址(android)
- 23. 如何使用volley發送POST請求與字符串集合
- 24. Store Volley請求數據
- 25. Volley PUT圖像請求
- 26. Volley Post GSON請求問題
- 27. Android Volley請求不響應
- 28. 如何使用protobuf支持補丁休息請求3
- 29. Volley Post請求不適用於API
- 30. Volley GET請求凍結應用