Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Android中发布对Rest服务器的改造_Php_Android_Json_Retrofit - Fatal编程技术网

Php 在Android中发布对Rest服务器的改造

Php 在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(

作为集团大学项目的一部分,我们使用一个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);
});
但我无法在安卓系统中实现这一点

这是我用来发布数据的方法:

    @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类的位置吗@奥马尔·易卜拉欣