web-dev-qa-db-ja.com

ボレーPOST文字列要求予期しないエラー500

プロジェクトでVolleyライブラリを使用していて、Unexpected response code 500応答として。

私は徹底的にstackoverflowを検索しましたが、それでも機能する解決策を見つけることができません。

以下は、GET文字列リクエストを行うための私のコードです

        val API = "http://squadtechsolution.com/Android/v1/allcompany.php"
        val requestQueue = Volley.newRequestQueue(mActivity)
        val stringRequest = StringRequest(
            Request.Method.GET,
            API,
            Response.Listener { response ->
                Log.i("dxdiag", response)
                mView.onFetchHttpDataResult(true)
                Toast.makeText(context, response, Toast.LENGTH_LONG).show()
            },
            Response.ErrorListener { error ->
                Toast.makeText(context, error.toString(), Toast.LENGTH_LONG).show()
                Log.i("dxdiag", error.printStackTrace().toString())
                mView.onFetchHttpDataResult(false)
            })
        requestQueue.add(stringRequest)

以下はスタックトレースです

2019-09-03 17:15:53.237 3308-3892/com.squadtechs.markhor.foodapp 
E/Volley: [194] BasicNetwork.performRequest: Unexpected response code 
500 for 
http://squadtechsolution.com/Android/v1/allcompany.php
2019-09-03 17:15:53.243 3308-3351/com.squadtechs.markhor.foodapp 
D/EGL_emulation: eglMakeCurrent: 0xa7d84180: ver 2 0 (tinfo 
0xa7d832b0)
2019-09-03 17:15:53.256 3308-3308/com.squadtechs.markhor.foodapp 
W/System.err: com.Android.volley.ServerError
2019-09-03 17:15:53.257 3308-3308/com.squadtechs.markhor.foodapp 
W/System.err:     at com.Android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.Java:205)2019-09-03 17:15:53.257 3308-3308/com.squadtechs.markhor.foodapp W/System.err:     at com.Android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.Java:131)2019-09-03 17:15:53.257 3308-3308/com.squadtechs.markhor.foodapp W/System.err:     at com.Android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.Java:111)2019-09-03 17:15:53.257 3308-3308/com.squadtechs.markhor.foodapp W/System.err:     at com.Android.volley.NetworkDispatcher.run(NetworkDispatcher.Java:90)

以下はPHPサーバー側で記述したコード:

<?php
    require 'db.php';

    $sql = "SELECT * FROM `company_profile`";
    $result = $con->query($sql);

    if ($result->num_rows > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {

        $id=$row['id']; 

        $company_name=$row['company_name'];
        $cuisine=$row['cuisine'];
        $conpany_phone=$row['conpany_phone'];
        $company_description=$row['company_description']; 
        $company_logo=$row['company_logo'];
        $company_type=$row['company_type'];
        $delivery_type=$row['delivery_type'];
        $delivery_range=$row['delivery_range']; 
        $delivery_fee=$row['delivery_fee'];
        $delivery_pickupinfo=$row['delivery_pickupinfo'];
        $address=$row['address'];

        $companyData[] = array('id'=> $id,'company_name'=> 
        $company_name,'cuisine'=> $cuisine,'conpany_phone'=> 
        $conpany_phone,'company_description'=> 
        $company_description,'company_logo'=> $company_logo,'company_type'=> 
        $company_type,'delivery_type'=> $delivery_type,'delivery_range'=> 
        $delivery_range,'delivery_fee'=> 
        $delivery_fee,'delivery_pickupinfo'=> $delivery_pickupinfo,'address'=> $address);   
    }
    echo $jsonformat=json_encode($companyData);
    } else {
        echo "0 results";
    }
    $conn->close();
?>
10
Muhammad Faizan

私はコードを少し修正し、郵便配達員でそれをチェックしました、それはうまくいきます。

JSONエンコードステートメントをifステートメントから移動しました。

// output data of each row
while($row = $result->fetch_assoc()) {

    $id=$row['id']; 

    $company_name=$row['company_name'];
    $cuisine=$row['cuisine'];
    $conpany_phone=$row['conpany_phone'];
    $company_description=$row['company_description']; 
    $company_logo=$row['company_logo'];
    $company_type=$row['company_type'];
    $delivery_type=$row['delivery_type'];
    $delivery_range=$row['delivery_range']; 
    $delivery_fee=$row['delivery_fee'];
    $delivery_pickupinfo=$row['delivery_pickupinfo'];
    $address=$row['address'];

    $companyData[] = array('id'=> $id,'company_name'=> 
    $company_name,'cuisine'=> $cuisine,'conpany_phone'=> 
    $conpany_phone,'company_description'=> 
    $company_description,'company_logo'=> $company_logo,'company_type'=> 
    $company_type,'delivery_type'=> $delivery_type,'delivery_range'=> 
    $delivery_range,'delivery_fee'=> 
    $delivery_fee,'delivery_pickupinfo'=> $delivery_pickupinfo,'address'=> $address);   
}
echo $jsonformat=json_encode($companyData);

$conn->close();
1

HTTPステータスコード500internal server errorを表し、クライアント側(ここではVolly)に問題がないことを明確に示していますが、問題はサーバー側にあります。サーバー側のphpコードをデバッグしてみてください。コードが適切に実行されていないため、HTTP応答ヘッダーで500 internal server errorが返されます。 Vollyは、受信したヘッダーをエラーとしてスローしました。

バックエンド開発者の場合は、モバイルアプリケーションと統合する前に、まずREST Clientsで試してください。 こちら から入手できます。 APIは十分にテストされ、正常に動作している必要があります。そうしないと、常にエラーが発生します。

1
Kiran Maniya

私はまず何かをGradle依存関係(ライブラリ)内にokhttpをインポートします。ここにドキュメントがあります

https://square.github.io/okhttp/

郵便配達員を開いて、コードメニューをクリックした後 enter image description here

送信ボタンの下にあるように、コードボタンがあります。それをクリックしてJava-> okhttpを選択します

コードをコピーして、Android studio内に貼り付けます。99.9%の確率で機能します。

1
raj kavadia

サーバー側のコードから以下の行を削除して確認してください

echo $jsonformat=json_encode($companyData);

そして、同じは郵便屋さんにも取り組んでいません

enter image description here

1
Kailash Chouhan

あなたのphpファイルに含めてみてください:

header('Content-Type: application/json');
header("Access-Control-Allow-Origin: *");

私はKotlinには慣れていませんが、Javaを使用するとうまくいきます。ここにコードがあります:

private void loadRecyclerViewData2(){
        URR_DATA="http://squadtechsolution.com/Android/v1/allcompany.php";
        StringRequest stringRequest = new StringRequest(Request.Method.GET,
                URR_DATA,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        System.out.println("****"+response);
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        System.out.println("***"+error.getMessage());                    }
                });
        requestQueue = Volley.newRequestQueue(Home.this);
        requestQueue.add(stringRequest);
    }

そして、私は次の出力を取得します:

I/System.out: ****
    [{"id":"1","company_name":"ABC","cuisine":"QATAR","conpany_phone":"4535345","company_description":"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut ","company_logo":"company_logo5d80bac690f2e.png","company_type":"Food","delivery_type":"yes","delivery_range":"55","delivery_fee":"","delivery_pickupinfo":"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, ","address":"33.58539655788556,71.43779296427965"}]
0
waghydjemy

あなたの問題はおそらくContentTypeにあります

あなたはこれを追加します:

@Override
            public String getBodyContentType() {
                return "application/x-www-form-urlencoded";
            }

または

return "application/json"

問題が解決しない場合JsonObjectRequestを使用する必要があります

0
Pouria Hemati

送信しようとしているすべてのパラメータが、サーバーが期待しているものと同じかどうかを確認してください。また、パラメーターが間違っているか欠落していると、500エラーが返されます。このパラメータを再確認してくださいCompany_mobileリクエストで。これで問題が解決することを願っています。

0
Anudeep

@Muhammad Faizanはあなたの疑問を無視し、問題IS500サーバーエラー

これIS原因

  • ポストマンとボレーは同じではありません
  • a)PHPコードorにバグがある)B)これが公開する環境設定がある

診断AにPHP ISSUE

phpでerror_logを開く必要があります。サーバーによっては、これを説明するのが難しい場合があります。そのため、もう1つの方法は、php.iniをerror_logに変更して、サーバーでこれを試すことです

ここから故意に持ち上げた

/*This always works for me:*/

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

/*However, this doesn't make PHP to show parse errors - the only way to show those errors is to modify your php.ini with this line:*/

display_errors = on
/*(if you don't have access to php.ini, then putting this line in .htaccess might work too):*/

php_flag display_errors 1

サーバーの環境問題を診断するには

error_logで何も生成されない場合は、access_logを試してください。どうして? 異なるタイプのリクエストが入ったことがおそらく表示されるため、POSTMANとVOLLEYは同じではありません

あなたはaccess_logをあまりにも潜在的に見て、postmanをクリックしてからボレークライアントをクリックするときにリアルタイムでそれを見る必要があります

事実:(私たちが確信できる理由)

私の直感は、間違って構成されたサーバーに問題があると言っています。これが当てはまる場合、access_logが最も役立つと信じてください。

とにかく:あなたがポストマンに入れているものとあなたのボレークライアントが送っているものの間には明らかに問題があります-それがこれを引き起こしています。

私がこれを引き起こしたのは、次のようなものです。

  • SAME Originエラーの可能性があります。
  • INTERNAL SERVER REDIRECTの問題である可能性があります。
  • $ _GETから$ _POSTへの転送が不正確である可能性があります(nginxでこの問題を確認しました)
  • これは、no-redirectとセキュリティの欠如によって壊されている悪いパスの問題である可能性があります。

プラットフォームやサーバー(Windows?Linux?nginx?php-fpm?apache?など)を知らせないと、私たちはそれらについてあなたを助けることができません

0
Mr Heelis

それでも解決しない場合は別の回答を投稿しています。郵便配達ですべてのヘッダーを次のようにコピーします

.addHeader("content-type", "application/json")
.addHeader("cache-control", "no-cache")
.addHeader("postman-token", "fa72f792-c9d3-7891-a544-f37f634f6ee1")

それをvollyパラメータに入れます

0
raj kavadia

db.phpファイルを確認してから、接続のオブジェクトを返す変数を確認してください。

$con->close()は1つのnであり、$conn->close()は2つのnである必要があります。

0
Yovi Prasetyo

5で始まるHTTPステータスコードは、エラーがサーバー側にあることを通知します。コード500は内部サーバーエラーとして解釈されます。これを解決するには、何が原因かを確認する必要があります。コードの誤りが原因である可能性があります。その場合は、error_logを開いてエラーを確認し、それに応じて対処できます。

データベースにアクセスしたり、関連するmysqlリソースを超える多数の同時接続が開かれたりするなど、サーバー機能が一時的に利用できないことが原因である可能性があります。

その他の場合には、エラーはerror_logファイルに記録されません。 cpanelを使用している場合は、ホームページの[Metrics]タブで[Errors]を開き、サーバーに要求した時間に従って確認します。 cpanelを使用していない場合は、対応するサーバーログを探します。

この右マークの回答に従ってください。それはあなたを助けるかもしれません

Androidで予期しない応答500に対処する方法

0
Vasudev Vyas

このエラー「500」はサーバー側のエラーを意味します。このエラーは次の場合に発生します:-

  1. パラメータまたはURLのスペルが間違っている可能性があります
  2. パラメータの欠如。
  3. または、サーバーで受け入れられないものを送信しています。
  4. また、URLの「http:/」または「https:/」も確認してください。

これらの条件を確認してください。私も同じ問題に直面しています。APIはPost Manで動作していますが、ボレーを使用するデバイスでは動作しません。これがお役に立てば幸いです。

0
Rahul Kushwaha