В рамках группового университетского проекта мы используем сервер PHP rest для отправки данных на сервер Oracle. Пока все методы get работают нормально, но мне сложно понять, как отправлять данные, поскольку они не работают.
Это PHP
$app->post('/room', function () use ($app) { $request = $app->getInstance()->request(); $room = json_decode($request->getBody(), true); $sql = 'INSERT INTO rooms VALUES(null, :room_pcm, :property_id)'; $query = oci_parse(getConnection(), $sql); $room_pcm = $room['ROOM_PCM']; $property_id = $room['PROPERTY_ID']; oci_bind_by_name($query, ':room_pcm', $room_pcm); oci_bind_by_name($query, ':property_id', $property_id); oci_execute($query); });
Но я не могу за свою жизнь заставить это работать на Android.
Это метод, который я использую для публикации данных:
@FormUrlEncoded @POST("/room") Room postRoom(Integer roomId, Double pcm, Integer propID);
И от деятельности
public void insertARoom(){ RestService.INSTANCE.getService().postRoom(200, 50.0, 103); }
Ошибка, о которой идет речь, заключается в том, что для параметра 1 требуется модифицированная аннотация. Я также попытался использовать обратный вызов типа Property, но это все еще давало мне проблемы.
В идеале, первый параметр должен быть нулевым, поскольку это первичный ключ, как я могу это сделать?
Спасибо Омару
РЕДАКТИРОВАТЬ:
Выход Logcat, и все же есть разрешение на доступ в Интернет.
03-31 06:15:37.230: E/AndroidRuntime(1913): FATAL EXCEPTION: main 03-31 06:15:37.230: E/AndroidRuntime(1913): Process: prcsc.android, PID: 1913 03-31 06:15:37.230: E/AndroidRuntime(1913): retrofit.RetrofitError: android.os.NetworkOnMainThreadException 03-31 06:15:37.230: E/AndroidRuntime(1913): at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:425) 03-31 06:15:37.230: E/AndroidRuntime(1913): at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:282) 03-31 06:15:37.230: E/AndroidRuntime(1913): at $Proxy0.postRoom(Native Method) 03-31 06:15:37.230: E/AndroidRuntime(1913): at prcsc.android.fragment.PropertyDetailFragment$3.onClick(PropertyDetailFragment.java:170) 03-31 06:15:37.230: E/AndroidRuntime(1913): at android.view.View.performClick(View.java:4438) 03-31 06:15:37.230: E/AndroidRuntime(1913): at android.view.View$PerformClick.run(View.java:18422) 03-31 06:15:37.230: E/AndroidRuntime(1913): at android.os.Handler.handleCallback(Handler.java:733) 03-31 06:15:37.230: E/AndroidRuntime(1913): at android.os.Handler.dispatchMessage(Handler.java:95) 03-31 06:15:37.230: E/AndroidRuntime(1913): at android.os.Looper.loop(Looper.java:136) 03-31 06:15:37.230: E/AndroidRuntime(1913): at android.app.ActivityThread.main(ActivityThread.java:5017) 03-31 06:15:37.230: E/AndroidRuntime(1913): at java.lang.reflect.Method.invokeNative(Native Method) 03-31 06:15:37.230: E/AndroidRuntime(1913): at java.lang.reflect.Method.invoke(Method.java:515) 03-31 06:15:37.230: E/AndroidRuntime(1913): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 03-31 06:15:37.230: E/AndroidRuntime(1913): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 03-31 06:15:37.230: E/AndroidRuntime(1913): at dalvik.system.NativeStart.main(Native Method) 03-31 06:15:37.230: E/AndroidRuntime(1913): Caused by: android.os.NetworkOnMainThreadException 03-31 06:15:37.230: E/AndroidRuntime(1913): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145) 03-31 06:15:37.230: E/AndroidRuntime(1913): at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:163) 03-31 06:15:37.230: E/AndroidRuntime(1913): at libcore.io.IoBridge.recvfrom(IoBridge.java:506) 03-31 06:15:37.230: E/AndroidRuntime(1913): at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488) 03-31 06:15:37.230: E/AndroidRuntime(1913): at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46) 03-31 06:15:37.230: E/AndroidRuntime(1913): at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240) 03-31 06:15:37.230: E/AndroidRuntime(1913): at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:168) 03-31 06:15:37.230: E/AndroidRuntime(1913): at java.io.BufferedInputStream.read(BufferedInputStream.java:227) 03-31 06:15:37.230: E/AndroidRuntime(1913): at com.android.okhttp.Connection.isReadable(Connection.java:214) 03-31 06:15:37.230: E/AndroidRuntime(1913): at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:108) 03-31 06:15:37.230: E/AndroidRuntime(1913): at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:292) 03-31 06:15:37.230: E/AndroidRuntime(1913): at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255) 03-31 06:15:37.230: E/AndroidRuntime(1913): at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206) 03-31 06:15:37.230: E/AndroidRuntime(1913): at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345) 03-31 06:15:37.230: E/AndroidRuntime(1913): at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:89) 03-31 06:15:37.230: E/AndroidRuntime(1913): at com.android.okhttp.internal.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:197) 03-31 06:15:37.230: E/AndroidRuntime(1913): at retrofit.client.UrlConnectionClient.prepareRequest(UrlConnectionClient.java:89) 03-31 06:15:37.230: E/AndroidRuntime(1913): at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:48) 03-31 06:15:37.230: E/AndroidRuntime(1913): at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:357)
Остальной адаптер использует GSON
public Rest getService() { if (RestService.service == null) { Gson gson = new GsonBuilder().registerTypeAdapter(Image.class, new ImageDeserialiser()).registerTypeAdapter(CountInteger.class, new CountDeserialiser()).create(); RestService.service = new RestAdapter.Builder() .setEndpoint(RestService.URL) .setConverter(new GsonConverter(gson)).build() .create(Rest.class); } return RestService.service; }
Чтобы отправить ваши данные, вы должны «префикс» каждого параметра с помощью аннотации @Field
следующим образом:
@FormUrlEncoded @POST("/room") Room postRoom(@Field("roomId") Integer roomId, @Field("pcm") Double pcm, @Field("propID") Integer propID);
извинения за поздний ответ на это.
Я решил это. Это было главным образом мое отсутствие понимания того, как Retrofit и Slim работали.
Вот как это должно было быть:
@POST("/room") void postRoom(@Body Room room, Callback<Integer> rc);
Все, что мне нужно было сделать из приложения Android, это передать ему параметр типа Room, а на стороне PHP он использовал JSON для декодирования тела и получения результата.
Еще раз большое спасибо,
Омар