У кого-нибудь есть пример, где вы читаете протобуф, используя залп ?. Я прочитал, что вы можете реализовать класс ProtobufRequest, но я не могу найти для него документацию. Спасибо за помощь.как запросить протобуф, используя залп?
ответ
Это не пример, и я (пока) не сделал это сам, но вот как я бы это сделать:
Один из способов заключается в расширении 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/
в противном случае, если вы хотите отправить протокол буфера сериализации в байт [] вы можете расширить Request<T>
. Вы должны отменить public byte[] getBody()
для тела запроса/полезной нагрузки, а защищен Response<Message> parseNetworkResponse(NetworkResponse response)
для ответа.
Затем вы должны использовать следующие функции для сериализации буфера протокола.
byte[] toByteArray();
parseFrom(byte[] data);
Если у вас есть решение, не забудьте поделиться.
Я сделал это, работа в порядке, надеюсь, что это полезно. Сначала создайте класс ProtobufRequest, как показано ниже, который расширяет Request, Request является основным классом запроса в Volley, тогда вы можете создать собственный запрос, который расширяет ProtobufRequest, что do custom 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 {
}
Просто наклеивании это здесь в случае, если это полезно: Я искал вокруг много для общего способа сделать что-то похожее на ответ jeff wang «s. Я ничего не мог найти, поэтому написал это. Дайте мне знать, если у вас есть какой-либо способ избавиться от незарегистрированного отлит в там ...
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); } }
От: 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);
}
}