Я отправляю запрос POST для создания некоторого ресурса данных на сервере. Я получаю код ответа 201 - все в порядке. Но мне также нужно получить 2 заголовка ответа. Эти заголовки содержат атрибуты созданного ресурса. Я не нашел способ, как это сделать, используя API ConnectionRequest.LWUIT IO ConnectionRequest: запрос POST, как получить заголовки ответа?
Класс имеет методы readHeaders (соединение) и getHeader (соединение). Но я не мог использовать их, когда получил ответ - получил исключение.
Мой пример кода приведен ниже:
ConnectionRequest reqresp = new ConnectionRequest() {
protected void buildRequestBody (java.io.OutputStream os) {
Logger.inst().write ("buildRequestBody");
final String body = "Dummy Request Body"; // necessary for my request
try {
os.write (body.getBytes());
}
catch (Exception ex) {
final String errMsg = ex.toString();
Logger.inst().write (errMsg);
throw new RuntimeException (errMsg);
}
}
protected void readResponse (InputStream input) throws IOException {
// Actually this method will not be called.
Logger.inst().write ("readResponse");
String respText;
try {
respText = Util.readToString (input);
}
catch (Exception ex) {
final String errMsg = ex.toString();
Logger.inst().write (errMsg);
throw new RuntimeException (errMsg);
}
Logger.inst().write (respText);
}
};
reqresp.setUrl ("MY SERVER URL");
reqresp.setPriority (ConnectionRequest.PRIORITY_HIGH);
reqresp.setPost (true);
reqresp.addRequestHeader ("header1", "val1");
reqresp.addRequestHeader ("Content-type", "application/json");
reqresp.addResponseCodeListener (new ActionListener() {
public void actionPerformed (ActionEvent ae) {
Logger.inst().write ("ResponseCodeListener:");
Logger.inst().write (ae.toString());
if (ae instanceof NetworkEvent) {
NetworkEvent evt = (NetworkEvent)ae;
Logger.inst().write ("message: " + evt.getMessage());
Logger.inst().write ("response code: " + evt.getResponseCode());
}
}
});
reqresp.addResponseListener (
new ActionListener() {
public void actionPerformed (ActionEvent ae) {
Logger.inst().write ("ResponseCodeListener:");
Logger.inst().write (ae.toString());
if (ae instanceof NetworkEvent) {
NetworkEvent evt = (NetworkEvent)ae;
Logger.inst().write ("message: " + evt.getMessage());
Logger.inst().write ("response code: " + evt.getResponseCode());
}
}
}
);
NetworkManager.getInstance().addToQueue (reqresp);
Уже пробовал - этот метод не назывался. Я не знал почему. Я также попытался переопределить getHeader(). То же самое - не называлось. Я перепробовал initConnection (соединение), и он был вызван. Круто! Я попытался сохранить переданное соединение в нем и использовать его позже в прослушивающем кодах ответа, но получил исключение (соединение уже закрыто). – Zakhar
Если я вызываю readHeaders() в initConnection() после вызова базовой реализации, то я получил исключение позже, когда вызывается метод buildRequestBody() (err msg - это что-то вроде «невозможно изменить запрос, который уже запущен») , – Zakhar
Проверьте подпись метода. Если полученный вами ответ равен 2xx, он должен быть вызван (посмотрите на код), ваши другие подходы к обходным методам не очень хорошо вписываются в жизненный цикл. –