2014-03-31 112 views
1

作爲組織大學項目的一部分,我們使用PHP rest服務器將數據發送到Oracle服務器。到目前爲止,所有的get方法都能正常工作,但我無法理解如何發佈數據,因爲它不起作用。在Android中發佈到Rest服務器

這是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 改裝註釋我也嘗試使用類型屬性的回調,但這仍然給我的問題。

理想情況下,第一個參數應該爲空,因爲它是主鍵,我怎麼能做到這一點?

感謝 奧馬爾

編輯:

logcat的輸出,然而Internet權限是存在的。

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; 
} 

回答

0

道歉對於遲到的回覆。

我解決了它。主要是我對改造和修身如何工作缺乏瞭解。

這是應該已經:

@POST("/room") 
    void postRoom(@Body Room room, Callback<Integer> rc); 

我不得不從Android應用程序需要做的就是通過它類型間的參數,並在PHP方面,它使用JSON對身體解碼和獲取結果。再次

非常感謝,

奧馬爾

+0

對不起,您是否介意在選擇Room類的地方放置一段PHP代碼? @ Omar.Ebrahim –

1

爲了發送你的數據,你必須 「前綴」 每個參數與@Field註釋是這樣的:

@FormUrlEncoded 
@POST("/room") 
Room postRoom(@Field("roomId") Integer roomId, @Field("pcm") Double pcm, @Field("propID") Integer propID); 
+0

它消除了回調錯誤,但它現在有一個socket發送數據的一個問題。不知道爲什麼。 –

+0

如何創建你的'RestAdapter'?你在你的'AndroidManifest.xml'中添加了'INTERNET'權限嗎?另外,你可以發佈完整的logcat錯誤堆棧來處理這個錯誤,真的很難用這麼少的信息來幫助你。謝謝。 –

+0

用logcat輸出編輯主帖 –