Php 在Android中发布对Rest服务器的改造
作为集团大学项目的一部分,我们使用一个PHP rest服务器将数据发送到Oracle服务器。到目前为止,所有的get方法都工作得很好,但我在理解如何发布数据方面遇到了困难,因为它不起作用 这是PHPPhp 在Android中发布对Rest服务器的改造,php,android,json,retrofit,Php,Android,Json,Retrofit,作为集团大学项目的一部分,我们使用一个PHP rest服务器将数据发送到Oracle服务器。到目前为止,所有的get方法都工作得很好,但我在理解如何发布数据方面遇到了困难,因为它不起作用 这是PHP $app->post('/room', function () use ($app) { $request = $app->getInstance()->request(); $room = json_decode($request->getBody(
$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);
});
但我无法在安卓系统中实现这一点
这是我用来发布数据的方法:
@FormUrlEncoded
@POST("/room")
Room postRoom(Integer roomId, Double pcm, Integer propID);
从活动中
public void insertARoom(){
RestService.INSTANCE.getService().postRoom(200, 50.0, 103);
}
它所说的错误是需要在参数1上进行改装注释。
我也尝试过使用类型为Property的回调,但这仍然给我带来了问题
理想情况下,第一个参数应该为null,因为它是主键,我如何才能做到这一点
谢谢
奥马尔
编辑:
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)
rest适配器正在使用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;
}
为了发送数据,您必须在每个参数前面加上如下注释的
@字段
:
@FormUrlEncoded
@POST("/room")
Room postRoom(@Field("roomId") Integer roomId, @Field("pcm") Double pcm, @Field("propID") Integer propID);
对迟来的回复表示歉意 我解决了。主要是我对改装和Slim的工作原理缺乏了解 应该是这样的:
@POST("/room")
void postRoom(@Body Room room, Callback<Integer> rc);
@POST(“/room”)
空邮室(@身体室,回叫rc);
在Android应用程序中,我所要做的就是向它传递一个Room类型的参数,在PHP端,它使用JSON解码主体并获取结果
再次非常感谢
Omar消除了回调错误,但现在打开套接字发送数据时出现问题。不知道为什么。如何创建您的
重新适应程序
?您是否在AndroidManifest.xml
中添加了INTERNET
权限?另外,你能为这个错误发布完整的logcat错误堆栈吗?要用这么少的信息来帮助你真的很困难。谢谢。使用logcat Output编辑主帖子您得到了一个NetworkOnMainThreadException
,因为您试图在UI线程中执行网络操作,这是Android 3.0及更高版本不允许的。即使使用改型,也不意味着请求将在另一个线程上运行。你必须把它包装成一个或一个“否”,你不应该把它包装成一个异步任务。您必须提供一个回调函数,它将在另一个线程中异步运行。对不起,您介意将PHP代码放在选择Room类的位置吗@奥马尔·易卜拉欣