aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Tananaev <anton.tananaev@gmail.com>2018-02-07 22:19:38 +1300
committerGitHub <noreply@github.com>2018-02-07 22:19:38 +1300
commit96e45b5a990182ddc4b878e48d93d301d014427a (patch)
tree9a7b6fea9881f4950f33cc7c12f05234d66ec60c
parent4ecde187a5577cd2dcff5dc82de22741ede04c6c (diff)
parent56669ce1a869d7a1e2ebda0ecf1d38174026bab9 (diff)
downloadtraccar-server-96e45b5a990182ddc4b878e48d93d301d014427a.tar.gz
traccar-server-96e45b5a990182ddc4b878e48d93d301d014427a.tar.bz2
traccar-server-96e45b5a990182ddc4b878e48d93d301d014427a.zip
Merge pull request #3755 from NateZ7/master
Added POST option to forward url
-rw-r--r--src/org/traccar/BasePipelineFactory.java3
-rw-r--r--src/org/traccar/WebDataHandler.java40
-rw-r--r--test/org/traccar/WebDataHandlerTest.java17
3 files changed, 56 insertions, 4 deletions
diff --git a/src/org/traccar/BasePipelineFactory.java b/src/org/traccar/BasePipelineFactory.java
index aa188d209..5a077da7c 100644
--- a/src/org/traccar/BasePipelineFactory.java
+++ b/src/org/traccar/BasePipelineFactory.java
@@ -238,7 +238,8 @@ public abstract class BasePipelineFactory implements ChannelPipelineFactory {
}
if (Context.getConfig().getBoolean("forward.enable")) {
- pipeline.addLast("webHandler", new WebDataHandler(Context.getConfig().getString("forward.url")));
+ pipeline.addLast("webHandler", new WebDataHandler(Context.getConfig().getString("forward.url"),
+ Context.getConfig().getBoolean("forward.json")));
}
if (commandResultEventHandler != null) {
diff --git a/src/org/traccar/WebDataHandler.java b/src/org/traccar/WebDataHandler.java
index 401216276..adc82486c 100644
--- a/src/org/traccar/WebDataHandler.java
+++ b/src/org/traccar/WebDataHandler.java
@@ -16,11 +16,14 @@
package org.traccar;
import com.fasterxml.jackson.core.JsonProcessingException;
+import com.ning.http.client.AsyncHttpClient;
import org.traccar.helper.Checksum;
import org.traccar.helper.Log;
import org.traccar.model.Device;
import org.traccar.model.Position;
+import java.util.HashMap;
+import java.util.Map;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
@@ -32,9 +35,13 @@ import java.util.TimeZone;
public class WebDataHandler extends BaseDataHandler {
private final String url;
+ private final boolean json;
+ private static final String KEY_POSITION = "position";
+ private static final String KEY_DEVICE = "device";
- public WebDataHandler(String url) {
+ public WebDataHandler(String url, boolean json) {
this.url = url;
+ this.json = json;
}
private static String formatSentence(Position position) {
@@ -121,10 +128,39 @@ public class WebDataHandler extends BaseDataHandler {
@Override
protected Position handlePosition(Position position) {
+ if (json) {
+ AsyncHttpClient.BoundRequestBuilder requestBuilder = Context.getAsyncHttpClient().preparePost(url);
+ requestBuilder.setBodyEncoding(StandardCharsets.UTF_8.name());
- Context.getAsyncHttpClient().prepareGet(formatRequest(position)).execute();
+ requestBuilder.addHeader("Content-Type", "application/json; charset=utf-8");
+ requestBuilder.setBody(prepareJsonPayload(position));
+ requestBuilder.execute();
+
+ } else {
+ Context.getAsyncHttpClient().prepareGet(formatRequest(position)).execute();
+ }
return position;
}
+ protected String prepareJsonPayload(Position position) {
+
+ Map<String, Object> data = new HashMap<>();
+ Device device = Context.getIdentityManager().getById(position.getDeviceId());
+
+ if (position != null) {
+ data.put(KEY_POSITION, position);
+ }
+
+ if (device != null) {
+ data.put(KEY_DEVICE, device);
+ }
+
+ try {
+ return Context.getObjectMapper().writeValueAsString(data);
+ } catch (JsonProcessingException e) {
+ Log.warning(e);
+ return null;
+ }
+ }
}
diff --git a/test/org/traccar/WebDataHandlerTest.java b/test/org/traccar/WebDataHandlerTest.java
index 70b098b0f..9c8f036b0 100644
--- a/test/org/traccar/WebDataHandlerTest.java
+++ b/test/org/traccar/WebDataHandlerTest.java
@@ -3,6 +3,8 @@ package org.traccar;
import org.junit.Test;
import org.traccar.model.Position;
+import java.text.ParseException;
+
import static org.junit.Assert.assertEquals;
public class WebDataHandlerTest extends ProtocolTest {
@@ -12,7 +14,7 @@ public class WebDataHandlerTest extends ProtocolTest {
Position p = position("2016-01-01 01:02:03.000", true, 20, 30);
- WebDataHandler handler = new WebDataHandler("http://localhost/?fixTime={fixTime}&gprmc={gprmc}&name={name}");
+ WebDataHandler handler = new WebDataHandler("http://localhost/?fixTime={fixTime}&gprmc={gprmc}&name={name}", false);
assertEquals(
"http://localhost/?fixTime=1451610123000&gprmc=$GPRMC,010203.000,A,2000.0000,N,03000.0000,E,0.00,0.00,010116,,*05&name=test",
@@ -20,4 +22,17 @@ public class WebDataHandlerTest extends ProtocolTest {
}
+ @Test
+ public void testPrepareJsonPayload() throws ParseException {
+
+ Position p = position("2016-01-01 01:02:03.000", true, 20, 30);
+
+ WebDataHandler handler = new WebDataHandler("http://localhost/", true);
+
+ assertEquals(
+ "{\"position\":{\"id\":0,\"attributes\":{},\"deviceId\":0,\"type\":null,\"protocol\":null,\"serverTime\":null,\"deviceTime\":1451610123000,\"fixTime\":1451610123000,\"outdated\":false,\"valid\":true,\"latitude\":20.0,\"longitude\":30.0,\"altitude\":0.0,\"speed\":0.0,\"course\":0.0,\"address\":null,\"accuracy\":0.0,\"network\":null},\"device\":{\"id\":1,\"attributes\":{},\"groupId\":0,\"name\":\"test\",\"uniqueId\":\"123456789012345\",\"status\":\"offline\",\"lastUpdate\":null,\"positionId\":0,\"geofenceIds\":null,\"phone\":null,\"model\":null,\"contact\":null,\"category\":null,\"disabled\":false}}",
+ handler.prepareJsonPayload(p));
+
+ }
+
}